十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于微信小程序的购物商城系统设计与实现

基于微信小程序的购物商城系统设计与实现 1. 项目背景与意义随着移动互联网的普及和微信生态的快速发展微信小程序凭借其「即用即走、无需下载安装」的轻量化特点已成为电商领域的重要流量入口。传统购物商城依赖独立 App 或 Web 端存在开发成本高、获客门槛高、用户留存难等问题。基于微信小程序的购物商城系统能够借助微信庞大的用户基础和社交传播能力显著降低商家的获客成本提升用户的购物体验。从技术角度看微信小程序提供了一整套成熟的开发框架、组件库和云开发能力开发者可以快速搭建商品展示、购物车、订单管理、支付结算等核心电商功能。本系统的设计与实现既是对微信小程序开发技术的综合实践也为中小商家提供了一套低成本、可复用的电商解决方案具有较强的工程应用价值和社会意义。2. 系统需求分析2.1 功能需求本购物商城系统面向普通消费者和后台管理员两类角色核心功能需求如下用户端微信授权登录、商品分类浏览、商品搜索、商品详情查看、加入购物车、提交订单、在线支付、订单查询、个人中心。管理端商品管理增删改查、上下架、分类管理、订单管理发货、退款处理、用户管理、数据统计。2.2 非功能需求性能首页加载时间控制在 2 秒以内商品列表支持分页加载。安全用户敏感信息加密存储支付流程接入微信官方支付接口。可维护性前后端分离代码结构清晰便于后续功能扩展。3. 系统技术栈选型本系统采用前后端分离架构前端基于微信小程序原生框架后端采用 Java Spring Boot 提供 RESTful API数据存储使用 MySQL 和 Redis。具体技术栈如下层次技术选型说明前端框架微信小程序原生框架WXML / WXSS / JS官方推荐组件丰富兼容性好后端框架Spring Boot 2.7 MyBatis-Plus快速构建 RESTful API简化数据库操作数据库MySQL 8.0 RedisMySQL 存储业务数据Redis 缓存热点数据与购物车支付微信支付 API v3实现小程序内在线支付部署Nginx 云服务器反向代理与静态资源托管选择上述技术栈主要基于以下考虑微信小程序原生框架无需额外引入跨端框架降低学习成本Spring Boot 生态成熟适合快速迭代MySQL 与 Redis 组合能够兼顾数据持久化与高并发读取性能。4. 系统总体设计4.1 系统架构设计系统整体采用分层架构自上而下分为表现层小程序端、业务逻辑层Spring Boot 服务和数据层MySQL / Redis。小程序端通过 HTTPS 请求调用后端接口后端统一返回 JSON 格式数据。架构图如下flowchart TD A[微信小程序客户端] --|HTTPS JSON| B[Nginx 反向代理] B -- C[Spring Boot 业务层] C -- D[MyBatis-Plus 数据访问层] D -- E[(MySQL 数据库)] C -- F[(Redis 缓存)] C -- G[微信支付 API]4.2 数据库设计数据库核心表包括用户表、商品表、分类表、购物车表、订单表和订单明细表。以商品表和订单表为例表结构设计如下-- 商品表 CREATE TABLE product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, category_id BIGINT NOT NULL COMMENT 分类ID, name VARCHAR(128) NOT NULL COMMENT 商品名称, subtitle VARCHAR(255) DEFAULT COMMENT 副标题, main_image VARCHAR(255) DEFAULT COMMENT 主图URL, price DECIMAL(10,2) NOT NULL COMMENT 价格, stock INT NOT NULL DEFAULT 0 COMMENT 库存, status TINYINT NOT NULL DEFAULT 1 COMMENT 1上架 0下架, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表; -- 订单表 CREATE TABLE order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) NOT NULL UNIQUE COMMENT 订单号, user_id BIGINT NOT NULL COMMENT 用户ID, total_price DECIMAL(10,2) NOT NULL COMMENT 订单总金额, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待支付 1已支付 2已发货 3已完成 4已取消, pay_time DATETIME DEFAULT NULL COMMENT 支付时间, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表;5. 核心功能实现与代码5.1 微信登录与用户鉴权小程序端调用wx.login获取临时 code后端通过 code 向微信接口换取 openid并生成自定义登录态 token 返回给前端。核心代码如下RestController RequestMapping(/api/user) public class UserController { Autowired private UserService userService; PostMapping(/login) public Result login(RequestBody LoginRequest request) { // 1. 调用微信接口用 code 换取 openid String openid userService.getOpenId(request.getCode()); // 2. 根据 openid 查询或创建用户 User user userService.findOrCreateByOpenId(openid); // 3. 生成 token 并返回 String token JwtUtil.generateToken(user.getId()); return Result.success(token); } }5.2 商品列表分页查询商品列表采用分页加载前端触底时请求下一页数据。后端使用 MyBatis-Plus 分页插件实现代码如下Service public class ProductServiceImpl implements ProductService { Autowired private ProductMapper productMapper; Override public PageResultProductVO pageProducts(Long categoryId, int pageNum, int pageSize) { PageProduct page new Page(pageNum, pageSize); LambdaQueryWrapperProduct wrapper new LambdaQueryWrapper() .eq(categoryId ! null, Product::getCategoryId, categoryId) .eq(Product::getStatus, 1) .orderByDesc(Product::getCreateTime); PageProduct result productMapper.selectPage(page, wrapper); // 实体转 VO隐藏敏感字段 ListProductVO voList result.getRecords().stream() .map(ProductConverter::toVO) .collect(Collectors.toList()); return new PageResult(voList, result.getTotal()); } }5.3 购物车管理购物车数据使用 Redis 存储以用户 ID 为 key商品 ID 为 field数量为 value利用 Hash 结构实现高效读写。核心代码如下Service public class CartServiceImpl implements CartService { Autowired private StringRedisTemplate redisTemplate; private static final String CART_KEY_PREFIX cart:; Override public void addToCart(Long userId, Long productId, Integer count) { String key CART_KEY_PREFIX userId; redisTemplate.opsForHash().increment(key, String.valueOf(productId), count); } Override public MapObject, Object getCart(Long userId) { String key CART_KEY_PREFIX userId; return redisTemplate.opsForHash().entries(key); } Override public void removeFromCart(Long userId, Long productId) { String key CART_KEY_PREFIX userId; redisTemplate.opsForHash().delete(key, String.valueOf(productId)); } }5.4 提交订单与微信支付用户提交订单后后端创建订单记录并调用微信支付统一下单接口返回支付参数给小程序端拉起支付。核心代码如下Service public class OrderServiceImpl implements OrderService { Autowired private OrderMapper orderMapper; Autowired private WxPayService wxPayService; Override Transactional(rollbackFor Exception.class) public PayResult createOrder(Long userId, ListCartItemDTO items) { // 1. 计算订单总金额 BigDecimal total calculateTotal(items); // 2. 生成订单号并保存订单 Order order new Order(); order.setOrderNo(generateOrderNo()); order.setUserId(userId); order.setTotalPrice(total); order.setStatus(0); orderMapper.insert(order); // 3. 调用微信支付统一下单 return wxPayService.unifiedOrder(order.getOrderNo(), total); } }5.5 小程序端商品列表页面小程序端使用 WXML 渲染商品卡片列表通过onReachBottom实现触底加载更多。核心代码如下Page({ data: { products: [], pageNum: 1, pageSize: 10, hasMore: true, loading: false }, onLoad() { this.loadProducts(); }, onReachBottom() { if (this.data.hasMore !this.data.loading) { this.loadProducts(); } }, async loadProducts() { this.setData({ loading: true }); const res await wx.request({ url: https://api.example.com/api/product/page, data: { pageNum: this.data.pageNum, pageSize: this.data.pageSize } }); const list res.data.data.list; this.setData({ products: this.data.products.concat(list), pageNum: this.data.pageNum 1, hasMore: list.length this.data.pageSize, loading: false }); } });6. 系统测试与总结本系统完成了用户登录、商品浏览、购物车、订单支付等核心流程的功能测试主要接口响应时间均在可接受范围内支付回调处理正常。基于微信小程序的购物商城系统充分利用了微信生态的流量优势前后端分离架构保证了系统的可扩展性和可维护性。后续可从以下方向继续优化引入消息队列削峰填谷、增加商品推荐算法、完善后台数据可视化大屏进一步提升系统的智能化水平和用户体验。
返回列表