✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
🍅文末获取项目下载方式🍅
一、项目背景介绍:
中国手机市场研究报告称,在中国,手机已经无处不在,中国3G商用进程的加速推进,使移动互联网活跃度日渐提升。互联网影响着每个人的工作与生活,手机商城软件已成为人们生活不可或缺的组成部分。市场的需求的呼唤,企业必须开发手机商城软件迎合时代发展需要。
二、项目技术简介:
- JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
- Spring:Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
- Mybatis:MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。 - Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
- Redis:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
三、系统功能模块介绍:
四、数据库设计:
1:‘收货地址表’(address)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
name | varchar | NULL | 姓名 |
address_info | varchar | NULL | 收货地址详情 |
tel | varchar | NULL | 联系方式 |
type | int | NULL | 是否默认地址[0:是,1:否] |
user_id | bigint | NULL | 用户ID |
2:‘管理员表’(admins)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | ID |
user_name | varchar | NULL | 用户名 |
pass_word | varchar | NULL | 密码 |
photo_img | varchar | NULL | 图片 |
name | varchar | NULL | 名称 |
status | int | NULL | 用户类型[0:超级管理员,1:普通管理员] |
3:‘购物车表’(cart)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
user_id | bigint | NULL | 用户ID |
phone_id | bigint | NULL | 手机ID |
num | int | NULL | 数量 |
create_time | datetime | NULL | 创建时间 |
4:‘团购详情表’(group_detail)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
user_id | bigint | NULL | 用户ID |
group_id | bigint | NULL | 团购活动ID |
create_time | datetime | NULL | 创建时间 |
5:‘团购活动表’(groups)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
phone_id | bigint | NULL | 手机ID |
num | int | NULL | 数量 |
end_num | int | NULL | 活动结束人数 |
banner_url | varchar | NULL | 广告图 |
info | varchar | NULL | 介绍词 |
create_time | datetime | NULL | 创建时间 |
price | varchar | NULL | 团购价格 |
add_no | varchar | NULL | 参与码 |
status | int | NULL | 状态[0:已开始,1:已结束] |
6:‘订单详情表’(order_detail)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
phone_id | bigint | NULL | 手机ID |
num | int | NULL | 数量 |
order_id | bigint | NULL | 订单ID |
create_time | datetime | NULL | 创建时间 |
7:‘订单表’(orders)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
order_no | varchar | NULL | 订单编号 |
create_time | datetime | NULL | 创建时间 |
total_price | varchar | NULL | 总价 |
status | int | NULL | 订单状态[0:代付款,1:待发货,2:已发货,3:已完成,4:已退单] |
user_id | bigint | NULL | 用户ID |
address | varchar | NULL | 收货地址 |
type | int | NULL | 类型[0:普通订单,1:秒杀订单,2:团购订单] |
active_id | bigint | NULL | 活动ID |
8:‘手机信息表’(phone)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 手机ID |
name | varchar | NULL | 手机名称 |
info | text | NULL | 简介 |
stock | int | NULL | 库存 |
price | varchar | NULL | 单价 |
detail | text | NULL | 详细信息 |
create_time | datetime | NULL | 创建时间 |
img_url | varchar | NULL | 展示大图 |
type_id | bigint | NULL | 分类ID |
banner | int | NULL | 首页推荐[0:是,1:否] |
9:‘手机详情图片表’(phone_imgs)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
img_url | varchar | NULL | 图片链接 |
phone_id | bigint | NULL | 手机ID |
10:‘手机标签关联表’(phone_tags)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
phone_id | bigint | NULL | 手机ID |
tag_id | bigint | NULL | 标签ID |
11:‘秒杀活动表’(seckill)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
phone_id | bigint | NULL | 手机ID |
num | int | NULL | 手机数量 |
start_time | datetime | NULL | 开始时间 |
end_time | datetime | NULL | 结束时间 |
banner_url | varchar | NULL | 广告图 |
info | varchar | NULL | 介绍词 |
create_time | datetime | NULL | 创建时间 |
price | varchar | NULL | 秒杀价格 |
status | int | NULL | 状态[0:未开始,1:已经开始,2:已结束] |
stock | int | NULL | 当前剩余 |
12:‘手机标签表’(tags)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
tag_name | varchar | NULL | 标签名称 |
create_time | datetime | NULL | 创建时间 |
13:‘手机分类表’(type)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
type_name | varchar | NULL | 分类名称 |
create_time | datetime | NULL | 创建时间 |
14:‘用户表’(users)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint | NULL | 主键ID |
user_name | varchar | NULL | 用户名 |
pass_word | varchar | NULL | 密码 |
nick_name | varchar | NULL | 昵称 |
head_img | varchar | NULL | 头像 |
create_time | datetime | NULL | 创建时间 |
五、功能模块:
-
首页:基于协同过滤算法为用户推荐用户感兴趣的手机,以及后台设置的秒杀活动以及轮播图
-
手机分类模块:该模块基于关键字,手机分类以及手机标签为用户快速检索自己喜欢的手机提供便利
-
个人中心模块:用户可以在该模块修改自己的个人信息,订单管理,收货地址管理,以及参与的团购活动管理
-
后台管理模块:后台管理包含所有的管理,主要模块有手机图片,手机信息,手机标签,标签管理,分类管理,团购活动管理,秒杀活动管理,管理员管理,前台用户管理,订单管理,图表统计分析等
六、代码示例:
首页
@PostMapping("/page")
private SimpleResponse page(@RequestBody Phone phone) {
PageVO<Phone> phonePageVO = phoneService.page(phone);
List<BaseSelectEntity> tagsEntity = phone.getTagsEntity();
if (CollectionUtil.isNotEmpty(tagsEntity)) {
List<Phone> phonePageVORecords = phonePageVO.getRecords();
List<PhoneTags> tags = phoneTagsService.getByTagIds(tagsEntity.stream().map(item -> item.getKey()).collect(Collectors.toList()));
if (CollectionUtil.isEmpty(tags)) {
phonePageVO.setTotal(0);
phonePageVO.setRecords(new ArrayList<>());
} else {
List<Long> collect = tags.stream().map(item -> item.getPhoneId()).collect(Collectors.toList());
List<Phone> collect1 = phonePageVORecords.stream().filter(item -> collect.contains(item.getId())).collect(Collectors.toList());
phonePageVO.setTotal(collect1.size());
phonePageVO.setRecords(collect1);
}
}
return SimpleResponse.success(phonePageVO);
}
手机分类模块
@GetMapping("/get/{id}")
private SimpleResponse getById(@PathVariable("id") Long id) throws Exception {
Phone phone = phoneService.getById(id);
if (phone != null) {
PhoneImgs imgs = new PhoneImgs();
imgs.setPhoneId(id);
List<PhoneImgs> phoneImgs = phoneImgsService.list(imgs);
phone.setPhoneImgsList(phoneImgs);
PhoneTags phoneTags = new PhoneTags();
phoneTags.setPhoneId(id);
List<PhoneTags> phoneTags1 = phoneTagsService.list(phoneTags);
if (CollectionUtil.isNotEmpty(phoneTags1)) {
List<Tags> tagsList = new ArrayList<>();
for (PhoneTags tags : phoneTags1) {
Tags tagsServiceById = tagsService.getById(tags.getTagId());
tagsList.add(tagsServiceById);
}
phone.setTags(tagsList);
}
}
return SimpleResponse.success(phone);
}
个人中心模块
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public SimpleResponse addOrder(@RequestBody Orders orders) throws Exception {
List<Cart> ordersCarts = orders.getCarts();
// 判断库存是否足够
for (Cart ordersCart : ordersCarts) {
Phone byId = phoneService.getById(ordersCart.getPhoneId());
if (byId.getStock() >= ordersCart.getNum()) {
Phone byId1 = new Phone();
byId1.setId(byId.getId());
byId1.setStock(byId.getStock() - ordersCart.getNum());
phoneService.updateById(byId1);
} else {
throw new Exception("当前商品【" + byId.getName() + "】,库存不足,库存为【" + byId.getStock() + "】,请重新选择数量!");
}
}
orders.setOrderNo(UUID.randomUUID().toString().substring(0, 8));
orders.setStatus(0);
orders.setType(0);
orders.setCreateTime(new Date());
Address address = new Address();
address.setUserId(orders.getUserId());
address.setType(0);
// 设置默认地址
List<Address> addresses = addressService.list(address);
if (CollectionUtil.isNotEmpty(addresses)) {
Address address1 = addresses.get(0);
orders.setAddress(address1.getName() + "-" + address1.getTel() + "-" + address1.getAddressInfo());
}
// 添加订单
ordersService.save(orders);
for (Cart ordersCart : ordersCarts) {
OrderDetail detail = new OrderDetail();
detail.setCreateTime(new Date());
detail.setOrderId(orders.getId());
detail.setNum(ordersCart.getNum());
detail.setPhoneId(ordersCart.getPhoneId());
// 添加订单详情
orderDetailService.save(detail);
}
// 删除购物车
cartService.removeByIds(ordersCarts.stream().map(item -> item.getId()).collect(Collectors.toList()));
return SimpleResponse.success();
}
后台管理模块
@GetMapping("/get1")
private SimpleResponse getById() {
List<Phone> phones = phoneService.list(new Phone());
List<Object> rowList = new ArrayList();
List<Object> colList = new ArrayList();
List<Object> colList1 = new ArrayList();
for (Phone phone : phones) {
rowList.add(phone.getName());
OrderDetail orderDetail = new OrderDetail();
orderDetail.setPhoneId(phone.getId());
List<OrderDetail> orderDetails = orderDetailService.list(orderDetail);
if (CollectionUtil.isEmpty(orderDetails)) {
colList.add(0);
} else {
int num = 0;
int num1 = 0;
for (OrderDetail detail : orderDetails) {
num += Double.parseDouble(phone.getPrice()) * detail.getNum();
num1 += detail.getNum();
}
colList.add(num);
colList1.add(num1);
}
}
Map<String, Object> map = new HashMap<>();
map.put("rowList", rowList);
map.put("colList", colList);
map.put("colList1", colList1);
return SimpleResponse.success(map);
}
七、项目总结:
1、移动手机传播信息的渠道是多种多样的,不仅有传统的社交链接分享,还有时下流行的二维码,商家通过这些渠道不仅能向传统的客户宣传自己的产品,而且还能通让客户通过商家的链接向更多的消费者传播商品的信息,并且这些信息的传播是快速免费的。因此在手机端建立自己的购物商城系统后,不仅能帮助商家快速地传播商城的产品信息,而且还能降低商家的广告费用。
2、与传统PC网站商城相比,手机购物商城里显示的商品信息更加简单集中,整个手机商城的存储空间会比PC网站商城的小,所以手机商城商家就可以减少对商城空间的购买成本。
3、对于消费者来说,可以不受时间、地点的限制,随时随地通过手机在商城网站上浏览商城的所有产品的详细信息和商家活动,在手机商城系统里下单还能享受一定额度的折扣。对于企业来说,使用手机商城软件是有"方便商家随时查看商城的经营情况,不仅摆脱了传统PC网站需要开电脑的限制,还能让商家在最短的时间内快速了解了所有的商品销售信息"的优势。
八、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻
链接点击直达:下载链接