尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于SpringBoot+Vue+MySQL的贸易行业CRM系统源码解析

发布时间:2026/9/24 21:49:22

资讯中心
01
ARTICLE

基于SpringBoot+Vue+MySQL的贸易行业CRM系统源码解析

基于SpringBoot+Vue+MySQL的贸易行业CRM系统源码解析
做贸易行业的家伙们应该都有体会客户资料散落在Excel、微信聊天记录、纸质名片里业务员各管一摊老板想看一眼整体销售进度比登天还难。我曾经接手过一个外贸公司的系统整理需求当时就在想如果能有一套贴合贸易场景的客户管理系统把客户、报价、订单、跟进记录全部串起来很多混乱都能理顺。这篇文章要聊的就是这么一套基于SpringBoot Vue MySQL的贸易行业CRM系统源码后端用成熟的Java生态前端用轻量的Vue框架数据库交给MySQL前后端分离跑起来就能用。适合正在做课程设计的学生、想快速搭建内部管理工具的小团队以及想学习企业级项目结构的开发者参考。这套源码的价值不光是能跑关键是它把贸易行业的业务逻辑做了落地。我拿到源码后从数据库初始化到前后端联调再到功能模块逐个验证整个过程走了一遍。接下来我就从结构、设计、核心逻辑、部署运行几个维度把我实际看到的、踩过的坑、觉得值得借鉴的地方都展开聊聊。1. 贸易型CRM和通用CRM到底差在哪很多团队上来就找开源的通用CRM装上之后发现根本用不起来这不是软件不行是行业属性没匹配上。贸易公司和做SaaS、做电商的客户管理逻辑差异非常大我用这套系统时第一件事就是看它的业务模型是按什么思路设计的。1.1 贸易流程决定了数据模型必须够专咱们理一下贸易公司日常最核心的线索询盘来了要判断这个客户是终端买家还是中间商客户要样品要记录寄样状态报价之后要盯反馈成单了要跟进生产、验货、订舱、发货还有收款节点。这个过程和标准CRM里的销售漏斗完全不是一回事它更像是一条流水线每个环节都有独立的单据、状态和时间节点。这套系统的数据库设计基本踩准了这个节奏。它不只是建了一张客户表、一张联系人表就完事而是围绕贸易链条拆出了几块核心数据客户基础信息除了公司名、地区、电话这些常规字段还专门加了客户来源、客户等级、所属业务员、贸易术语偏好这类字段。联系人子表贸易公司经常一个客户对应采购、老板、财务、仓库多个联系人主表加子表的设计是合理的。报价单和订单模块把报价、成交、订单执行串起来能看出单子走到哪一步了。跟进记录这个字段太重要了贸易业务依赖高频沟通跟进记录不仅是备忘更是后续复盘报价转化率的数据来源。1.2 权限模型要匹配贸易团队的分工模式贸易团队的分工通常有两种形态一种是业务员从头跟到尾一个客户的所有信息都归一个人管另一种是前端业务员负责开发和接单后端跟单员负责下单、盯生产、安排发货两边需要共享客户信息但职责边界不同。这套CRM的权限设计做了一个基础的数据隔离 角色授权模型。系统里有管理员、业务员、跟单员这类角色后端在查询客户列表时会根据当前登录人的角色动态拼接查询条件。管理员看全部数据业务员只能看自己名下的客户和订单跟单员可以看分配给自己的那些单据。提示如果你拿这套源码做二次开发权限这块推荐优先扩展。贸易公司最敏感的就是客户资源归属数据隔离做不好再好的功能也没人敢用。1.3 报表需求比想象中更朴素贸易公司的老板和管理层不问什么客户活跃度商机转化率问的最多的就三件事这个月新开发了多少客户、一共出了多少货、回款了多少。这套系统的统计模块就是围绕这类朴素需求做的按业务员、按月份、按产品维度去汇总订单金额和客户数量页面用图表直观展示反而比很多假大空的智能分析实用得多。2. 技术栈选型的逻辑为什么是SpringBoot、Vue和MySQL源码用了SpringBoot Vue MySQL这套组合说它主流已经不足以形容了这个组合基本是Java全栈开发的事实标准。但选型不能只看名气要理解每个组件在这个项目里到底解决什么问题。2.1 SpringBoot负责把后端复杂度藏起来贸易CRM这类系统的后端要管的事情不少登录鉴权、接口权限、业务数据CRUD、文件上传、报表聚合查询。如果用传统的SSM框架光配置文件就够写半天SpringBoot最大的价值是约定大于配置把Web容器、数据源、事务管理等基础设施都自动装配好了。我点开源码的pom.xml看了下用的Spring Boot版本是2.x集成了一组很实用的起步依赖spring-boot-starter-web内嵌Tomcat打包后一个jar直接跑。spring-boot-starter-security登录鉴权和安全控制的基础。mybatis-plus-boot-starter数据持久层。lombok减少实体类getter/setter这些样板代码。mysql-connector-javaMySQL驱动。这套依赖组合没有堆砌花哨的组件每个都有明确用途对学习者和二次开发者来说依赖清单本身就是一个很好的脚手架参考。2.2 Vue负责让交互界面轻快好用之前看过不少老CRM项目页面还是JSP加jQuery那套每次点击都整页刷新体验很复古。这套源码的前端用了Vue 2 Element UI实现的是单页应用效果。切换客户列表、打开订单详情、查看统计图表都是局部更新操作起来顺畅很多。Vue在这个项目里的几个核心用法值得关注vue-router做前端路由登录、客户管理、订单管理、统计报表这些页面通过路由切换配合路由守卫实现未登录拦截。Axios封装所有请求统一走封装的axios实例带上token响应后统一处理业务状态码。Element UI组件库表格、表单、弹窗、标签页这些基础组件开箱即用。2.3 MySQL在数据库选型里的性价比优势贸易CRM的数据量级除非做到几千人规模的大集团否则绝大多数公司一天新增的数据量也就在几百几千条这个范围。MySQL完全撑得住而且部署简单、运维成本低、资料多是一个最稳妥的选择。这套系统的数据库设计整体也符合范式要求客户表、订单表、产品表这些核心表都设置了合理的主外键关联。字符集默认utf8mb4能正常存中文和特殊符号排序规则选择utf8mb4_general_ci兼容性没问题。3. 数据库设计贸易业务的核心表拆解拿到源码第一步我一般先看数据库脚本因为表结构设计能直接反映系统作者的业务理解深度。这套CRM初始化脚本放在了项目的sql目录下导入就能用。整个库有十几张表下面挑几张核心的逐个拆开说说。3.1 客户信息表不只是通讯录客户表是这个系统的主数据表它承载的字段比普通通讯录复杂得多。核心字段包括客户编码、客户名称、客户类别、客户来源、所属区域、所属业务员ID、客户等级、信用额度、备注等等。值得点赞的设计是客户编码这个字段。贸易公司习惯用编码来标识客户这比直接用自增ID要灵活。后续关联订单、合同、发货记录用客户编码做业务关联即使数据库迁移也不会乱。还有一个细节是客户类别源码用的是字典值。因为贸易公司的客户分类维度各有不同有的是按终端/中间商分有的是按重点/普通分做成字典而不是固定枚举二次开发时改起来方便。3.2 联系人表一对多拆分在贸易业务里一个大客户的联系人不只一个有下单的、有催货的、有谈账期的。如果联系人字段直接塞到客户表里就会出现大量重复录入或者字段冗余的问题。这套源码把联系人拆成了独立子表通过客户ID和客户表关联。联系人字段包括姓名、性别、职位、手机、座机、邮箱、是否主联系人、备注等。系统在页面上支持一个客户下维护多个联系人并且可以标记主联系人这个设计贴近实际使用习惯。3.3 报价单和订单表把贸易环节串起来贸易业务最关键的转变是从潜在机会变成实际成交报价单和订单表就是记录这个过程的载体。报价单表保存了报价时间、客户ID、联系人ID、业务员、产品明细、总金额、币种、报价有效期、状态等。订单表则增加了交货日期、付款方式、贸易术语、运输方式、订单状态等字段状态会随着业务流程流转。注意如果你准备在这个系统上做二次开发订单状态流转是重点扩展方向。贸易订单往往会经历确认、生产中、已发货、已收款、已完成等多个阶段建议把状态定义做成枚举类或者配置表避免魔法数字散落在代码里。3.4 跟进记录表最容易被忽视但最有价值跟进记录表保存了和客户每一次沟通的时间、内容摘要、跟进方式、下次跟进时间。这个东西在贸易行业是刚需因为业务周期长一个客户从初次询盘到真正下单可能经过几个月中间沟通了无数次。没有跟进记录换个人接手这个客户基本等于从零开始。这套系统的跟进记录设计得比较轻量没有搞复杂的CRM活动流就是单纯的流水表。好处是结构清晰、查询快二次开发时如果需要分析跟进频率对成交率的影响可以基于这张表做汇总。3.5 用户和角色表权限控制的基石用户表和角色表的职责很清晰用户表存账号密码和基本信息角色表存角色编码和名称用户角色关联表把两者关联起来。后端在SpringSecurity的过滤器链里根据当前用户的角色决定接口是否放行。有一点要注意默认源码导入后管理员账号密码一般是admin/admin123这类弱口令部署到正式环境前第一件事就是改掉初始密码这是安全和基本的素养。4. 后端核心模块的实现要点后端源码的代码结构走的是主流分层Controller接收请求Service处理业务逻辑Mapper负责数据库操作。下面分解几个核心模块的实现思路方便后面对着源码看的时候快速定位。4.1 登录鉴权和Token机制这套系统没有用传统的Session方案走的是基于JWT的无状态认证。用户登录成功后后端生成一个带签名信息的Token字符串返回给前端前端存起来后续每次请求都放在请求头里带过来。后端通过拦截器解析Token确认用户身份是否有效。用JWT有几个好处无状态后端不需要维护Session水平扩展时不用考虑Session同步问题。携带信息Token里面可以直接放用户ID、用户名、角色编码减少每次查库的次数。前后端分离友好移动端如果后续要对接同一套接口直接复用。实际代码里登录接口调用AuthenticationManager进行身份验证验证通过后使用JwtUtil工具类生成Token。拦截器会放行/login其他接口都会校验请求头里的Authorization字段解析失败就返回401提示未登录。4.2 客户管理的CRUD与搜索过滤客户管理模块是这套系统最核心的部分接口覆盖了常见的操作新增客户、编辑客户、删除客户、分页查询客户列表、根据条件搜索客户、查看客户详情。分页查询使用的MyBatis-Plus的Page对象前端传入当前页码和每页条数后端返回总数和列表数据。搜索条件支持客户名称模糊查询、客户类别精确查询、所属业务员查询等。最值得注意的是数据权限的处理如果是业务员角色查询时会自动拼接WHERE business_uid 当前用户ID这个条件这就是前面说的数据隔离的具体实现。4.3 订单管理和状态流转订单管理模块的列表查询相对复杂因为涉及多表关联。前端要展示订单号、客户名称、业务员名称而订单表里只存了客户ID和业务员ID所以SQL要做联表查询把客户名称和业务员名称一次性查出来。订单状态这个字段是用数据库的tinyint类型存储的代码里通过常量或枚举来定义含义。后端接口在更新订单状态时会有基础的合法性判断比如订单还未确认时不能直接跳到已完成状态状态只能按正常顺序流转或者被管理员强制修改。4.4 统计报表的聚合查询统计模块在常规的管理系统里经常被做成鸡肋但这两个统计功能我觉得做得比较务实订单金额按月份汇总和客户数量按业务员汇总。实现上就是MyBatis-Plus的条件构造器加聚合查询函数例如按月份分组统计订单金额总数返回的结果集用VO对象去接收前端用柱状图或者折线图展示。这类聚合查询在数据量不大时性能完全够用不需要额外引入OLAP数据库。4.5 全局异常处理和统一返回格式好的后端项目一定会处理异常响应格式。这套系统里定义了一个通用返回结果类R包含了状态码、消息提示和返回数据三个字段所有Controller接口返回这个类型前端根据statusCode判断请求是否成功。全局异常通过RestControllerAdvice统一拦截业务异常返回具体的错误提示系统异常返回系统繁忙这种兜底信息。这样前端catch到错误后可以统一处理而不是让Tomcat默认的错误页面直接暴露给用户体验会好很多。5. 前端页面组织与关键交互逻辑前端代码是基于Vue CLI创建的标准工程目录结构很清晰src下面按api、assets、components、router、utils、views划分。整体代码量不算大看懂骨干逻辑后做二次开发上手很快。5.1 路由配置和访问拦截前端路由表在router/index.js中定义主要包含登录页、首页、客户管理、订单管理、统计报表、个人中心几个主要页面。路由守卫的逻辑比较直接每次跳转前判断本地有没有Token如果没有就redirect到登录页如果已经登录后访问登录页则直接跳回首页。这里有一个细节可以改进目前路由守卫只做了是否登录的判断没有做角色是否匹配的判断。也就是说即使一个普通业务员手动修改前端路由去访问管理员页面路由层面也不会拦截。虽然后端接口权限兜住了数据不会真正泄露但如果要做更细的前端权限控制建议引入动态路由根据角色编码动态注册可访问的路由表。5.2 Axios请求封装与错误处理前端在utils/request.js里统一封装了axios实例。核心逻辑包括设置baseURL让它指向后端接口地址。请求拦截器里从localStorage取出Token添加到请求头的Authorization字段。响应拦截器里判断HTTP状态码和后端返回的业务状态码401跳回登录页其他错误提示ElMessage。封装request.js是一个好习惯项目里所有页面都通过统一的request函数发起请求后期如果要调整公共逻辑比如加loading效果、加日志上报只需要改动一个文件不用每个页面都去改。5.3 客户管理页面表格、分页与筛选客户列表页面是权限最高的页面也是我看到代码后觉得前端组件用得最典型的地方。整个页面结构是搜索栏在上表格在中间分页器在底部。搜索栏的输入框绑定了data中的查询条件对象点击搜索后触发查询列表方法请求后端接口。表格部分用了Element UI的el-table每一列对应一个字段。操作列里有编辑和删除按钮点击编辑会打开一个el-dialog弹窗里面是el-form表单提交时根据是否有ID判断是新增还是编辑。分页器用的是el-pagination组件current-change和size-change事件触发更新列表。这是后台管理系统最经典的前端交互方式掌握了这套流程其他管理页面基本都能照葫芦画瓢。5.4 统计报表页面图表的二次封装统计页面没有自己去手写图表而是使用了ECharts并用了一个轻量的Vue封装组件。图表数据的获取方式依然是调用后端接口拿到聚合结果后把数据组装成ECharts需要的格式再setOption到图表实例上。柱状图展示每个月的订单金额趋势饼图展示各业务员的客户数量占比。这类可读性强的图表对于管理层来说非常直观也是整套系统里最能体现数据分析价值的部分。5.5 Element UI组件的二次封装我要特别提一下这套前端代码里对Element UI组件做了一些简单的封装。比如表格组件页面里很多类似的表格展示逻辑作者抽取了一个通用表格组件传入列配置和数据源就能渲染减少了大量重复代码。不过也要提个醒过度封装会让新人接手时摸不着头脑。如果你是在这个源码基础上做团队协作开发建议先和团队成员统一一下封装粒度的约定大而全的万能组件往往是最难维护的。6. 从零搭建运行环境步骤和踩坑记录这部分是实操经验很多拿到源码跑不起来的人90%的问题不是源码问题而是环境问题。我按从头到位的完整顺序把每一步操作和可能遇到的坑写出来。6.1 后端环境准备JDK版本推荐JDK 1.8或JDK 11。这个源码没有用到太新的Java语法JDK 8完全可以跑。Maven使用3.6以上版本。配置好阿里云镜像否则依赖下载速度会让你怀疑人生。IDE推荐IDEA打开项目后等待Maven自动下载依赖第一次启动需要耐心因为要拉很多jar包。容易踩的坑JDK版本太高。有些人机器上装的是JDK 17或21运行Spring Boot 2.x项目时可能会出现兼容问题比如CGLIB代理相关报错最简单的解法是切回JDK 8。6.2 MySQL数据库初始化先在本地安装好MySQL 5.7或8.0然后创建数据库实例字符集选utf8mb4。用数据库管理工具Navicat或者MySQL Workbench打开sql目录下的初始化脚本直接运行即可建表并插入初始数据。容易踩的坑MySQL 8.0的认证插件和旧版本不一样如果后端连数据库时报Unable to load authentication plugin caching_sha2_password需要在数据库连接URL里加上allowPublicKeyRetrievaltrue并且确认驱动版本支持8.0。6.3 修改后端配置文件打开application.yml主要检查这几项配置数据库连接地址确认IP、端口、数据库名正确。数据库用户名和密码改成你自己的。端口配置默认8080如果要改记得前端也要同步改。提示配置文件里的密码一定不要硬编码正式环境建议放到环境变量或者配置中心里。这个项目作为学习/课程设计硬编码可以接受但要有这个意识。6.4 前端环境准备和依赖安装前端需要Node.js环境推荐使用14.x或16.x版本。npm源建议切换为淘宝镜像否则安装依赖时网络问题会让人崩溃。在项目根目录执行npm install等待依赖安装完成后执行npm run serve启动开发服务器。容易踩的坑Node.js版本不兼容。node-sass这个老旧依赖在最新版Node.js上经常编译失败解决方案是换成dart-sasssass包或者直接使用Node 14/16。如果装完依赖出现gyp ERR的报错基本就是这个问题了。6.5 前后端联调配置前端开发服务器的默认端口是8080后端接口也在8080会冲突。Vue CLI的开发服务器默认端口是8080如果被占用会自动询问是否换端口也可以自己在vue.config.js里配一个比如8081。更关键的是跨域问题。前端请求后端时浏览器会拦截跨域请求。源码前端在vue.config.js中配置了devServer.proxy代理方案是把/api前缀的请求代理到http://localhost:8080。如果你没走代理而是直接在axios里写全路径记得在后端写一个CORS配置类允许跨域请求。6.6 打包发布到服务器开发调试没问题后部署上线是另一套流程。前端执行npm run build打包出来的静态文件在dist目录用Nginx托管即可。Nginx配置里关键一点前端页面用的是history路由模式需要配置location /的try_files否则刷新页面就会出现404。后端打jar包执行mvn clean package -DskipTests生产环境用nohup java -jar xxx.jar 启动。前后端全部部署后Nginx还需要把/api请求反向代理到SpringBoot服务地址。7. 二次开发视角这套源码还能往哪个方向演进如果你不满足于只是让它跑起来想在这个项目上做真正的二次开发下面几个方向是我基于贸易行业需求整理出来的扩展建议。7.1 更细粒度的订单流程管理现在的订单流程是简化的。实际贸易业务里订单后面往往还跟着生产进度表、验货报告、装箱单、提单、报关资料这些一系列的单证。可以考虑增加独立的单证管理模块把订单和单证关联起来每个单证维护状态形成一张更完整的业务全景图。7.2 客户跟进提醒和自动化现在系统有跟进记录但缺少主动提醒。贸易业务里这个客户三天没联系了这个报价单明天过期这类时间敏感信息非常重要。可以加一个定时任务每天扫描数据库把这些信息生成待办事项推送给对应业务员。SpringBoot里用Scheduled注解就能实现难度不大但能极大提升系统粘性。7.3 更完善的报表和导出现在的图表统计偏向基础汇总。贸易管理诉求里应收账款账龄分析、订单利润统计、客户流失预警这些都值得做。还可以把查询结果导出成Excel方便财务和业务部门做二次加工。后端可以用EasyExcel或POI实现导出功能。7.4 消息通知渠道的接入目前系统内部的通知只能站内信实现。实际使用中业务员更希望客户有重要进展时收到邮件或者企业微信通知。可以接入SpringBoot的邮件发送功能在订单状态变化、报价单被查看等关键节点自动发邮件给相关人员。这块的扩展逻辑清晰效果也立竿见影。8. 写在最后的几个大实话这套系统的源码完整度在同类项目中算不错的。SpringBoot Vue MySQL的选型让它天然具备清晰的学习路径就算你是刚接触前后端分离开发不久把源码吃透也能建立起一个完整的企业级项目认知框架。如果你是为了交课程设计作业直接跑起来截几张图、写写运行说明就够交差了但如果你想真正从中学到东西我建议你重点吃透三块一是数据库表之间的关联关系是如何支撑业务流转的二是后端如何通过拦截器和角色控制接口权限三是前端路由守卫和axios拦截器是怎么配合完成登录态管理的。这三块逻辑理顺了你基本就掌握了这类管理系统的核心套路。最后给个实操建议拿到源码后不要急着改功能先原封不动跑通整个链路看一遍数据从MySQL到后端再到前端的完整流动过程然后尝试改一个最简单的字段比如给客户表加一个客户生日字段从前端表单到数据库全链路走一遍。这个过程做下来你对整个系统的理解会有一个质的飞跃。源码本身只是一个起点你和它之间能产生多大价值取决于你到底愿意花多少时间去理解它的设计思路而不是仅仅把它当成一个能启动的项目。祝各位都能把这套系统跑顺学到真东西。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。