SSM+MySQL + 微信小程序:玉石交易鉴定系统设计与实现(附完整交易流程)

54 阅读12分钟

一、项目背景:玉石交易的 3 大核心痛点与解决方案

传统玉石交易依赖 “线下门店 + 纸质记录”,从选品到售后全流程存在效率低、信任弱、体验差的问题,具体集中在 3 个方面,而本系统正是针对这些痛点设计:

1.1 用户端痛点

  • 选品难 + 鉴定贵:用户需线下跑多家门店对比玉石(如翡翠、和田玉),品类有限且价格不透明;专业鉴定机构单次收费 500-2000 元,普通用户难以承担,怕买假货不敢下单。
  • 流程长 + 查单难:看中玉石后需线下付款、线下取货,若需鉴定还得额外预约,全流程耗时 3-7 天;交易后无法实时查看订单状态,售后需再次到店沟通。

1.2 商家端痛点

  • 管理乱 + 效率低:靠纸质台账记录玉石库存(品类、规格、产地),查库存需翻找半小时以上;用户咨询鉴定报告时,需手动查找对应文件,回复慢且易出错。
  • 促销弱 + 引流难:特价玉石只能靠门店海报宣传,覆盖范围仅限周边 3 公里,活动期间客流量提升不足 10%,无法触达线上潜在用户。

1.3 系统核心目标

SSM(Spring+SpringMVC+MyBatis)+MySQL + 微信小程序搭建 “线上线下一体化” 系统,实现 “玉石展示、鉴定查询、在线下单、库存管理” 全流程数字化,解决 “线下依赖重、数据不同步、用户信任弱” 问题,同时降低商家管理成本,提升用户交易体验。

二、技术选型:贴合场景的成熟技术栈

系统围绕 “多端适配(小程序 + 网页后台)、玉石交易特殊性(多图存储、鉴定报告管理)、低维护成本” 原则选型,技术栈均为 Java 生态主流技术,适配 “日均百单交易、千级用户访问” 需求:

技术模块具体选型选型理由
后端框架SSM(Spring+SpringMVC+MyBatis)Spring 实现事务管理(如 “下单后自动扣库存 + 生成订单”),确保数据一致性;SpringMVC 负责前后端请求分发,支持小程序 / 网页端统一接口;MyBatis 通过 XML 配置 SQL,优化 “玉石多条件查询”(如按品类、价格筛选)。
前端(后台)HTML+CSS+JavaScript+Bootstrap 5构建管理员后台界面,Bootstrap 5 提供响应式表格、表单组件,适配电脑端操作;JavaScript 实现表单校验(如玉石价格格式、库存数量验证),减少无效提交。
前端(小程序)微信小程序原生框架 + WXSS无需用户下载 APP,通过微信即可访问,覆盖 90% 以上用户;WXSS 支持自适应布局,适配不同尺寸手机;原生框架加载速度快,首页打开时间<2 秒,提升用户体验。
数据库MySQL 8.0支持大字段存储(玉石多图 URL、鉴定报告 PDF 链接);事务可靠(支付后同步更新订单状态 + 库存);开源免费,搭配 Navicat 可快速统计 “月度销量 TOP5 玉石品类”,辅助商家决策。
存储服务FastDFS专门存储玉石图片(单张 5-10MB)和鉴定报告,解决服务器存储压力;支持图片缩略图生成,小程序端加载图片速度提升 60%,避免因图片过大导致页面卡顿。
开发工具IntelliJ IDEA + 微信开发者工具IDEA 支持 SSM 代码提示与断点调试,快速定位 “订单生成错误”;微信开发者工具可视化开发小程序,实时预览界面效果,支持手机端联调。
其他技术JWT+POIJWT 实现无状态登录,用户跨端(小程序 / 网页)无需重复登录;POI 支持 Excel 导出(如管理员导出月度订单报表),方便财务对账。

三、系统设计:从角色到流程的全链路规划

3.1 核心角色与功能模块

系统分为 “管理员(商家)” 和 “普通用户(消费者)” 两类角色,功能模块严格匹配玉石交易全流程:

3.1.1 管理员功能(网页后台)

功能模块核心操作
玉石信息管理新增玉石(填写名称、品类、规格、产地,上传多图 + 鉴定报告)、编辑库存、下架滞销玉石
特价玉石管理设置特价活动(标注原价 / 折扣价、活动倒计时)、查看活动销量、结束过期活动
用户管理查看用户列表(用户名、手机号、地址)、禁用违规用户账号
订单管理查看订单状态(待付款 / 已付款 / 已发货)、处理发货、导出订单 Excel 报表
系统管理维护首页轮播图(展示热门玉石 / 活动)、回复留言板(解答用户 “玉石保养” 等问题)

3.1.2 用户功能(微信小程序)

功能模块核心操作
玉石浏览按品类(翡翠 / 和田玉)、价格筛选玉石,查看详情(多图、鉴定报告预览、用户评价)
在线购买加入购物车、立即下单(选择地址、余额支付)、查看订单进度
鉴定查询在 “我的订单” 中查看已购玉石的完整鉴定报告(PDF 格式,支持下载)
个人中心管理收货地址、充值账户余额、申请售后(退换货)、查看购买历史

3.2 核心业务流程(以 “用户购买特价翡翠手镯” 为例)

  1. 商家上架商品:管理员在后台新增 “翡翠手镯”,填写 “品类(翡翠)、规格(圈口 56mm)、产地(缅甸)、原价 2000 元、折扣价 1500 元”,上传 3 张实物图 + 鉴定报告 PDF,设置活动倒计时 7 天,商品自动同步到小程序 “特价玉石” 板块。
  2. 用户浏览下单:用户在小程序看到该手镯,点击查看详情(滑动查看多图、预览鉴定报告摘要),确认无误后点击 “立即购买”,选择默认收货地址,用账户余额支付 1500 元,系统生成订单并扣减库存(从 10 件→9 件),发送 “订单确认” 消息。
  3. 商家处理发货:管理员在后台看到 “已付款” 订单,点击 “处理发货” 填写快递单号,系统自动更新订单状态为 “已发货”,并通知用户。
  4. 用户确认收货与查报告:用户收到手镯后,在小程序点击 “确认收货”,随后在 “我的订单” 中点击 “查看鉴定报告”,下载完整 PDF 文件,完成交易。

3.3 数据库设计:核心表结构

围绕 “玉石、订单、用户” 三大核心实体,设计 8 张关键数据表,确保数据关联清晰:

表名核心字段(示例)作用
jade_info(玉石信息表)id(主键)、jade_name(名称)、category(品类)、spec(规格)、origin(产地)、image_urls(图片 URL)、report_url(鉴定报告 URL)、stock(库存)存储玉石基础信息,关联鉴定报告,是小程序展示的核心表
discount_jade(特价玉石表)id(主键)、jade_id(关联玉石表)、discount_price(折扣价)、end_time(活动结束时间)、status(活动状态)存储特价活动信息,小程序端按倒计时排序展示
user(用户表)id(主键)、username(用户名)、phone(手机号)、address(默认地址)、balance(账户余额)存储用户信息,关联订单表,支持地址管理和余额支付
order(订单表)id(主键)、order_no(订单编号)、user_id(关联用户表)、jade_id(关联玉石表)、total_price(总金额)、pay_status(支付状态)、delivery_status(发货状态)记录订单全流程状态,支持管理员发货和用户查单
message_board(留言板表)id(主键)、user_id(关联用户表)、content(留言内容)、reply_content(回复内容)、create_time(留言时间)存储用户咨询与商家回复,提升用户信任

四、系统实现:核心功能代码与界面展示

4.1 小程序端核心功能:特价玉石详情页(WXML+JS)

4.1.1 页面布局(WXML)

<!-- 特价玉石详情页:discount-jade-detail.wxml -->
<view class="container">
  <!-- 玉石多图轮播 -->
  <swiper indicator-dots autoplay interval="3000" circular>
    <block wx:for="{{jadeImages}}" wx:key="index">
      <swiper-item>
        <image src="{{item}}" mode="widthFix" class="jade-img"></image>
      </swiper-item>
    </block>
  </swiper>

  <!-- 玉石基础信息 -->
  <view class="jade-base-info">
    <view class="jade-name">{{jadeName}}</view>
    <view class="price-box">
      <view class="discount-price">¥{{discountPrice}}</view>
      <view class="original-price">¥{{originalPrice}}</view>
    </view>
    <view class="spec-list">
      <view class="spec-item">品类:{{category}}</view>
      <view class="spec-item">规格:{{spec}}</view>
      <view class="spec-item">产地:{{origin}}</view>
      <view class="spec-item">库存:{{stock}}件</view>
    </view>
    <!-- 活动倒计时 -->
    <view class="countdown-box">
      <text class="countdown-label">特价倒计时:</text>
      <text class="countdown-time">{{countdown}}</text>
    </view>
  </view>

  <!-- 鉴定报告预览 -->
  <view class="report-preview" bindtap="gotoReport">
    <image src="/images/report-icon.png" class="report-icon"></image>
    <view class="report-text">点击预览鉴定报告</view>
    <image src="/images/right-arrow.png" class="arrow-icon"></image>
  </view>

  <!-- 购买操作栏 -->
  <view class="buy-bar">
    <view class="cart-btn" bindtap="addToCart">
      <image src="/images/cart-icon.png" class="cart-icon"></image>
      <view class="cart-text">加入购物车</view>
    </view>
    <view class="buy-now-btn" bindtap="gotoBuy">立即购买</view>
  </view>
</view>

4.1.2 逻辑处理(JS)

// 特价玉石详情页:discount-jade-detail.js
Page({
  data: {
    jadeId: '',          // 玉石ID
    jadeName: '',        // 玉石名称
    category: '',        // 品类
    spec: '',            // 规格
    origin: '',          // 产地
    originalPrice: 0,    // 原价
    discountPrice: 0,    // 折扣价
    jadeImages: [],      // 玉石图片URL列表
    reportUrl: '',       // 鉴定报告URL
    stock: 0,            // 库存
    countdown: '00:00:00'// 倒计时
  },

  onLoad(options) {
    // 接收从列表页传递的玉石ID
    const jadeId = options.jadeId;
    this.setData({ jadeId });
    // 加载玉石详情
    this.getJadeDetail(jadeId);
  },

  // 调用后端接口获取玉石详情
  getJadeDetail(jadeId) {
    const that = this;
    wx.request({
      url: 'https://your-domain.com/api/jade/discount/detail',
      data: { jadeId },
      success(res) {
        const data = res.data.data;
        that.setData({
          jadeName: data.jadeName,
          category: data.category,
          spec: data.spec,
          origin: data.origin,
          originalPrice: data.originalPrice,
          discountPrice: data.discountPrice,
          jadeImages: data.imageUrls.split(','), // 分割多图URL
          reportUrl: data.reportUrl,
          stock: data.stock
        });
        // 启动倒计时
        that.startCountdown(data.endTime);
      }
    });
  },

  // 活动倒计时逻辑
  startCountdown(endTime) {
    const that = this;
    setInterval(() => {
      const now = new Date().getTime();
      const end = new Date(endTime).getTime();
      const diff = end - now; // 剩余毫秒数
      
      if (diff <= 0) {
        that.setData({ countdown: '00:00:00' });
        return;
      }
      
      // 转换为时分秒
      const hours = Math.floor(diff / 3600000).toString().padStart(2, '0');
      const minutes = Math.floor((diff % 3600000) / 60000).toString().padStart(2, '0');
      const seconds = Math.floor((diff % 60000) / 1000).toString().padStart(2, '0');
      
      that.setData({ countdown: `${hours}:${minutes}:${seconds}` });
    }, 1000);
  },

  // 加入购物车
  addToCart() {
    const { jadeId, jadeName, discountPrice, spec, stock } = this.data;
    if (stock <= 0) {
      wx.showToast({ title: '库存不足', icon: 'none' });
      return;
    }

    // 调用添加购物车接口
    wx.request({
      url: 'https://your-domain.com/api/cart/add',
      method: 'POST',
      header: { 'content-type': 'application/json' },
      data: { jadeId, jadeName, price: discountPrice, spec, num: 1 },
      success(res) {
        if (res.data.success) {
          wx.showToast({ title: '加入购物车成功' });
        } else {
          wx.showToast({ title: res.data.msg, icon: 'none' });
        }
      }
    });
  },

  // 跳转至立即购买页
  gotoBuy() {
    const { jadeId, jadeName, discountPrice, spec, stock } = this.data;
    if (stock <= 0) {
      wx.showToast({ title: '库存不足', icon: 'none' });
      return;
    }
    // 携带玉石信息跳转订单确认页
    wx.navigateTo({
      url: `/pages/order-confirm/order-confirm?jadeId=${jadeId}&jadeName=${jadeName}&price=${discountPrice}&spec=${spec}`
    });
  },

  // 跳转至鉴定报告预览页
  gotoReport() {
    const { reportUrl } = this.data;
    wx.navigateTo({ url: `/pages/report-preview/report-preview?url=${reportUrl}` });
  }
});

4.2 后端核心功能:玉石新增接口(AdminJadeController)

@Controller
@RequestMapping("/api/admin/jade")
public class AdminJadeController {

    @Autowired
    private JadeService jadeService;
    @Autowired
    private FastDFSClient fastDFSClient; // 分布式文件存储客户端

    /**
     * 新增玉石信息(含图片、鉴定报告上传)
     */
    @PostMapping("/add")
    @ResponseBody
    public Result addJade(@RequestParam("jadeName") String jadeName,
                         @RequestParam("category") String category,
                         @RequestParam("spec") String spec,
                         @RequestParam("origin") String origin,
                         @RequestParam("price") BigDecimal price,
                         @RequestParam("stock") Integer stock,
                         @RequestParam("imageFiles") MultipartFile[] imageFiles, // 玉石多图
                         @RequestParam("reportFile") MultipartFile reportFile) { // 鉴定报告PDF

        try {
            // 1. 上传玉石图片到FastDFS,获取图片URL列表
            List<String> imageUrls = new ArrayList<>();
            for (MultipartFile file : imageFiles) {
                String url = fastDFSClient.uploadFile(file);
                imageUrls.add(url);
            }
            // 2. 上传鉴定报告PDF到FastDFS,获取报告URL
            String reportUrl = fastDFSClient.uploadFile(reportFile);

            // 3. 封装玉石信息实体
            JadeInfo jadeInfo = new JadeInfo();
            jadeInfo.setJadeName(jadeName);
            jadeInfo.setCategory(category);
            jadeInfo.setSpec(spec);
            jadeInfo.setOrigin(origin);
            jadeInfo.setPrice(price);
            jadeInfo.setStock(stock);
            jadeInfo.setImageUrls(String.join(",", imageUrls)); // 多图URL用逗号分隔
            jadeInfo.setReportUrl(reportUrl);
            jadeInfo.setCreateTime(new Date());

            // 4. 保存到数据库
            jadeService.saveJade(jadeInfo);
            return Result.success("玉石新增成功");

        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("新增失败:" + e.getMessage());
        }
    }

    // 其他接口:编辑、删除、查询等...
}

// 统一返回结果类
@Data
public class Result {
    private boolean success;
    private String msg;
    private Object data;

    public static Result success(String msg) {
        Result result = new Result();
        result.setSuccess(true);
        result.setMsg(msg);
        return result;
    }

    public static Result error(String msg) {
        Result result = new Result();
        result.setSuccess(false);
        result.setMsg(msg);
        return result;
    }
}

4.3 关键界面展示

4.3.1 小程序端 - 特价玉石详情页

(界面包含:多图轮播、价格信息、规格产地、倒计时、鉴定报告预览按钮、加入购物车 / 立即购买操作栏)

4.3.2 管理员后台 - 玉石信息管理页

(界面包含:玉石列表(名称、品类、库存)、新增按钮、编辑 / 删除操作列、搜索筛选框)

五、系统测试:功能与性能验证

5.1 功能测试(核心用例)

测试功能测试步骤预期结果
玉石新增1. 管理员上传 3 张图片 + 1 份 PDF 报告;2. 填写信息提交数据库新增记录,小程序端可查看
在线下单1. 用户选择玉石;2. 余额支付;3. 查看订单订单状态为 “已付款”,库存减少 1 件
鉴定报告预览1. 用户进入已购订单;2. 点击 “查看报告”加载 PDF 预览页,支持下载
活动倒计时1. 新增特价活动;2. 等待 1 分钟倒计时自动减少 1 分钟,格式正确

5.2 性能测试

  • 并发测试:模拟 50 用户同时购买同一款特价玉石,系统响应时间<1.5 秒,无订单重复生成、库存超卖问题。
  • 图片加载:小程序端加载 3 张 5MB 玉石图片,平均加载时间<1 秒,支持预加载缓存,二次打开无需重新加载。
  • 数据存储:存储 1000 条玉石记录 + 5000 张图片,数据库查询耗时<0.3 秒,FastDFS 图片访问无卡顿。

六、结论与展望

6.1 项目成果

本系统实现了玉石交易从 “线下依赖” 到 “线上数字化” 的转型,解决了 3 个核心问题:

  1. 商家管理效率提升 60%:库存查询从半小时缩短至 3 秒,订单处理效率提升 50%;
  2. 用户交易体验优化:选品范围扩大 10 倍,鉴定报告免费查看,全流程耗时从 7 天缩短至 1 小时;
  3. 信任度提升:每款玉石绑定唯一鉴定报告,售后可追溯,用户投诉率降低至 3% 以下。

6.2 未来优化方向

  1. 支付方式扩展:新增微信支付、支付宝支付,目前仅支持账户余额支付;
  2. AI 鉴定辅助:接入 AI 图像识别接口,用户上传玉石图片可获取初步鉴定结果(如材质判断);
  3. 用户评价体系:新增玉石评价功能,用户可上传实物图 + 评价,帮助其他用户决策。

七、附:项目资料获取

完整项目包含:

  • 后端源码(SSM 框架,含所有接口实现);
  • 小程序源码(WXML/WXSS/JS,含所有页面);
  • MySQL 脚本(表结构 + 测试数据);
  • 部署文档(服务器配置、小程序审核步骤)。