✨作者主页:IT毕设梦工厂✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目
一、前言
随着互联网的迅速发展,电子商务已被广大互联网用户所接受,网上书店系统作为电子商务的一部分也迅速发展起来。网上书店相比传统书店具有明显的优势,如避免书目订货的局限和盲目性,克服了看样订货投入大、费用高、管理难的不足。此外,网上书店的选择范围更广、能直观看样、随时添订、结算及时、快捷方便,周转高速 。
现有的网上书店系统存在一些问题,如用户界面不够友好,操作复杂,导致用户体验不佳;系统功能不够完善;数据更新不够及时,导致图书信息滞后;支付和物流系统不够成熟,影响了用户的购买体验 。
本课题旨在设计并实现一个功能齐全、用户友好的网上书店系统,该系统将提供简洁直观的用户界面,优化图书检索功能,实现数据的实时更新,以及集成安全便捷的支付和物流系统。通过本课题的研究,希望能够为用户和书店提供一个便捷、安全的在线购书平台 。
在设计的网上书店系统中,管理人员负责用户账户的创建与维护、卖家的审核与管理、图书分类与信息的更新、图书借阅与归还流程的管理、图书资讯的发布与维护、以及订单的监控与管理;卖家则能够管理自己的图书信息、审核用户的借阅请求、处理图书归还的审核、并管理自己图书的订单;用户可以浏览图书和资讯、使用购物车进行购买、管理自己的订单、申请借阅图书以及归还图书。系统通过这些功能模块的整合,旨在提供一个便捷的在线购书和借阅体验。
本课题的研究具有重要的理论意义和实际意义。从理论角度来看,它为电子商务领域提供了新的研究思路,即如何利用信息技术提升网上书店的服务质量和用户体验。从实际角度来看,该系统的应用将显著提高图书交易的效率,降低运营成本,提升用户满意度,推动图书电子商务市场的发展 。
二、开发环境
- 开发语言:Java/Python
- 数据库:MySQL
- 系统架构:B/S
- 后端:SpringBoot/SSM/Django/Flask
- 前端:Vue
三、系统界面展示
- 网上书店界面展示:
管理员-图书类型管理:
管理员-图书信息管理:
用户-查看图书信息:
用户-图书借阅申请:
卖家-图书借阅审核:
卖家-图书信息管理:
卖家-图书归还审核:
卖家-图书订单管理:
四、部分代码设计
- 项目实战-代码参考:
@RestController
@RequestMapping("/cart")
public class CartController {
@Resource
OrderService orderService;
@Resource
UserService userService;
@Resource
ItemService itemService;
@Resource
CartService cartService;
@AuthAccess(message = "安卓添加购物车")
@PostMapping("/app/add")
public Result<?> addCart(@RequestBody ItDTO itDTO){
Item item = itemService.findById(itDTO.getItemId());
User user = userService.findById(itDTO.getUserId());
createCart(item,user,1);
return Result.success();
}
@AuthAccess(message = "安卓获取购物车")
@GetMapping("/app/getCarts/{userId}")
public Result<?> getCartList(@PathVariable Integer userId) {
return Result.success(cartService.getMyCart(userId));
}
@AuthAccess(message = "安卓删除购物车")
@DeleteMapping("/app/delete/{id}")
public Result<?> deleteById(@PathVariable Integer id){
cartService.deleteById(id);
return Result.success();
}
@PostMapping("/buyCart")
public Result<?> buyCart(@RequestBody List<Cart> carts,@RequestParam BigDecimal totalPrice,
@RequestParam Integer addressId, HttpServletRequest request) {
// 生成订单号
String orderNo = IdUtil.getSnowflake().nextIdStr();
// 如果是 Web 端
if (StrUtil.isEmpty(request.getHeader("source-client"))) {
// 生成订单名称
String orderName = carts.get(0).getCartName() + "等多件商品";
// 拼接支付URL
String payUrl = "http://localhost:9090/alipay/pay?subject=" + orderName + "&traceNo=" + orderNo + "&totalAmount=" + totalPrice;
// 对所以加入购物车的商品进行处理,添加订单号
for (Cart cart : carts) {
Order order = new Order();
// 设置商品ID
order.setProductId(cart.getProductId());
// 获取商品名称
order.setOrderName(cart.getCartName());
// 设置订单号
order.setOrderNo(orderNo);
// 设置订单价格
order.setPayPrice(cart.getPayPrice());
// 设置邮费
order.setPostFee(BigDecimal.ZERO);
// 设置商品数量
order.setCount(cart.getCount());
// 设置支付状态
order.setState(2);
order.setUserId(cart.getUserId());
order.setUsername(cart.getUsername());
order.setOrderPicture(cart.getCartPicture());
//构建创建时间
Date currDate = new Date();
order.setCreateTime(currDate);
orderService.save(order);
//从购物车中删除
cartService.deleteById(cart.getId());
}
// 返回支付URL
return Result.success(payUrl);
}
// 如果是手机端
else {
// 对所有加入购物车的商品进行处理,添加订单号,添加地址
// for (Order order : orders) {
// order.setOrderNo(orderNo);
// order.setAddressId(addressId);
// // 同时也更新商品的选择数量
// orderMapper.updateById(order);
// }
// 回传统一的订单编号
return Result.success(orderNo);
}
}
/**
* @param itemId 要加入购物车的物品ID
* @param userId 用户的ID
* @return 返回成功消息就可以了
*/
@GetMapping("/add")
public Result<?> addToCart(@RequestParam Long itemId,@RequestParam Integer userId,@RequestParam Integer count){
Item item = itemService.findById(itemId);
User user = userService.findById(userId);
createCart(item,user,count);
return Result.success();
}
private Cart createCart(Item item, User user, Integer count) {
Cart cart = new Cart();
// 设置商品ID
cart.setProductId(item.getId());
// 获取商品名称
cart.setCartName(item.getTitle());
// 设置订单价格
cart.setPayPrice(item.getPrice());
// 设置邮费
cart.setPostFee(BigDecimal.ZERO);
// 设置商品数量
cart.setCount(count);
cart.setUserId(user.getId());
cart.setUsername(user.getUsername());
cart.setCartPicture(item.getImage());
cartService.save(cart);
return cart;
}
@GetMapping("/getCarts")
public Result<?> getCarts(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(defaultValue = "") String search) {
return Result.success(cartService.getCarts(pageNum,pageSize,search));
}
@PostMapping("/deleteCarts")
public Result<?> deleteCarts(@RequestBody List<Cart> carts) {
for (Cart cart:carts) {
cartService.deleteById(cart.getId());
}
return Result.success();
}
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
OrderService orderService;
@Resource
UserService userService;
@Resource
ItemService itemService;
@PostMapping
public Result<?> save(@RequestBody Order order){
orderService.save(order);
return Result.success();
}
//更新订单
@PutMapping
public Result<?> update(@RequestBody Order order){
orderService.update(order);
return Result.success();
}
//根据订单ID删除订单
@DeleteMapping("/{id}")
public Result<?> delete(@PathVariable Long id){
orderService.delete(id);
return Result.success();
}
//根据订单ID查询订单
@GetMapping("/{id}")
public Result<?> getById(@PathVariable Long id){
return Result.success(orderService.getById(id));
}
//购买商品,新建一个订单,单独购买一个商品
@GetMapping("/buy")
public Result<?> buy(@RequestParam Long itemId, @RequestParam Integer userId, @RequestParam Integer count,
HttpServletRequest request){
Item item = itemService.findById(itemId);
User user = userService.findById(userId);
String orderNo = IdUtil.getSnowflake().nextIdStr();
// 先新建未支付订单
Order order = createOrder(item, user, orderNo,count);
// 如果是小程序,回传这个订单,进入确认订单页面
if (StrUtil.isNotEmpty(request.getHeader("source-client"))){
return Result.success(order);
}
// 如果是web端
else {
BigDecimal price = item.getPrice().multiply(new BigDecimal(count));
String payUrl = "http://localhost:9090/alipay/pay?subject=" + item.getTitle() + "&traceNo=" + orderNo + "&totalAmount=" + price;
return Result.success(payUrl);
}
}
private Order createOrder(Item item, User user, String orderNo, Integer count) {
Order order = new Order();
// 设置商品ID
order.setProductId(item.getId());
// 获取商品名称
order.setOrderName(item.getTitle());
// 设置订单号
order.setOrderNo(orderNo);
// 设置订单价格
order.setPayPrice(item.getPrice());
// 设置邮费
order.setPostFee(BigDecimal.ZERO);
// 设置商品数量
order.setCount(count);
// 设置支付状态
order.setState(2);
order.setUserId(user.getId());
order.setUsername(user.getUsername());
order.setOrderPicture(item.getImage());
//构建创建时间
Date currDate = new Date();
order.setCreateTime(currDate);
save(order);
return order;
}
/**
* 查询全部的订单消息
* @param pageNum 当前的页数
* @param pageSize 一页的大小
* @param search 搜索的关键词
* @return 结果集
*/
@GetMapping
public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(defaultValue = "") String search) {
return Result.success(orderService.findPage(pageNum,pageSize,search));
}
/**
* 查询对应用户的订单信息
* @param pageNum 当前页码
* @param pageSize 每一页的条数
* @param search 搜索的商品名称
* @param state 查询订单的状态类型,0表示全部
* @return 返回分页好的数据表
*/
@GetMapping("/user_order")
public Result<?> findUserOrder(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(defaultValue = "") String search,
@RequestParam(defaultValue = "0") Integer state) {
return Result.success(orderService.findUserOrder(pageNum,pageSize,search,state));
}
/**
* 根据传入的订单编号查出该订单购买的商品
*/
@GetMapping("/selectOrder")
public Result<?> findOrderByNo(@RequestParam String orderNo){
return Result.success(orderService.findOrderByNo(orderNo));
}
// 小程序端模拟支付接口,直接模拟收到微信回调更新库存等等操作
@PostMapping("/mockPay")
public Result<?> mockNotify(@RequestBody List<Order> orders){
// 获取当前支付时间
Date payment = new Date();
// 更新订单状态
for (Order order : orders) {
// 先进行库存扣减,如果扣减失败,直接弹出库存不足
if (itemService.updateStock(order.getProductId(),order.getCount()) <= 0){
throw new ServiceException("407","您购买的商品中有库存不足的情况");
}
// 设置支付时间
order.setPaymentTime(payment);
// 设置支付状态
order.setState(1);
// 更新订单
orderService.update(order);
}
return Result.success();
}
// 发货接口
@PutMapping("/send/{id}")
public Result<?> Send(@PathVariable("id") Integer id){
if (orderService.updateStateWithoutDate(id,4) <= 0)
throw new ServiceException("400",",发货出错");
return Result.success();
}
// 确定收货接口
@PutMapping("/receive/{id}")
public Result<?> receive(@PathVariable Integer id){
// 创建当前时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = format.format(new Date());
// 更新订单状态和结束时间
if (orderService.updateReceiptState(id,now) <= 0)
throw new ServiceException("400",",确认收货出错");
return Result.success();
}
// 根据订单编号删除订单接口
@DeleteMapping("/delete/{orderNo}")
public Result<?> deleteByOrderNo(@PathVariable String orderNo){
if (orderService.deleteByOrderNo(orderNo)<= 0)
throw new ServiceException("400",",删除订单出错");
return Result.success();
}
/**
* 获取驾驶舱所需要的图表数据
* @return 图表数据
*/
@GetMapping("/charts")
public Result<?> charts() {
List<Order> orders = orderService.getPayList();
// 获取下单的日期,并对日期排序
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
List<String> dateList = orders.stream().map(order -> (format.format(order.getPaymentTime())))
.distinct().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
List<Dict> lineList = new ArrayList<>();
// 获取每天下单的金额和
for (String date : dateList) {
// 从 orders 里面找到这一天的订单
BigDecimal sum = orders.stream().filter(order -> format.format(order.getPaymentTime()).equals(date))
.map(order -> order.getPayPrice().multiply(new BigDecimal(order.getCount())))
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
Dict dict = Dict.create().set("date",date).set("value",sum);
lineList.add(dict);
}
List<Dict> barList = new ArrayList<>();
// 包装柱状图的数据,每天的订单量
for (String date : dateList) {
Integer numbers = orders.stream().filter(order -> format.format(order.getPaymentTime()).equals(date))
// 把每个订单映射成 1
.map(order -> 1).reduce(Math::addExact).orElse(0);
Dict dict = Dict.create().set("date",date).set("count",numbers);
barList.add(dict);
}
// todo 饼图的数据根据商品 id 来分类
Dict res = Dict.create().set("lineData", lineList).set("barData", barList);
// 包装柱状图数据
return Result.success(res);
}
}
五、论文参考
- 计算机毕业设计选题推荐-网上书店-论文参考:
六、系统视频
- 网上书店-项目视频:
计算机毕业设计选题推荐-网上书店-Java/Python项目
结语
计算机毕业设计选题推荐-网上书店-Java/Python项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:⬇⬇⬇