毕业设计实战:基于Spring Boot的贸易行业CRM系统全栈开发 [特殊字符]

30 阅读7分钟

一、项目缘起:从销售困境到数字化解决方案

记得去年在一家贸易公司实习时,看到销售团队还在用Excel表格管理客户信息,每次找客户资料都要翻半天,有时候还会出现版本混乱的情况。😅 销售经理经常抱怨:"这个客户上次沟通到哪一步了?这个订单发货了没有?" 这些问题让我深刻意识到,贸易行业真的太需要一个专业的CRM系统了!

随着信息技术的深入应用,传统的手工管理方式已经远远跟不上现代贸易的快节奏。想象一下,客户信息散落在各个销售人员的电脑里,订单状态更新不及时,售后跟进全靠记忆...这种工作模式不仅效率低下,还容易出错。正是在这样的背景下,我决定开发这个贸易行业CRM系统,帮助贸易企业实现数字化转型!🚀

二、技术选型:为什么是Spring Boot + MySQL?

2.1 Spring Boot - 开发者的福音

选择Spring Boot真的是太明智了!它就像个贴心的开发助手,帮我们处理了各种繁琐的配置。还记得第一次用传统的SSH框架时,光配置文件就写了一堆,现在用Spring Boot,几行代码就能跑起来一个Web服务:

@SpringBootApplication
public class TradeCrmApplication {
    public static void main(String[] args) {
        SpringApplication.run(TradeCrmApplication.class, args);
        System.out.println("贸易CRM系统启动成功!🎉");
    }
}

2.2 MySQL - 稳定可靠的数据管家

数据库选MySQL真的是毋庸置疑!开源、免费、性能稳定,对于学生项目来说再合适不过了。而且它的社区非常活跃,遇到问题随时都能找到解决方案。

2.3 B/S架构 - 随时随地办公

采用B/S架构意味着用户只需要一个浏览器就能使用系统,无论是在办公室、家里还是出差途中,都能随时处理业务,这太符合现代企业的移动办公需求了!

三、系统设计:我是这样思考业务逻辑的

3.1 角色权限设计

在设计系统时,我充分考虑了贸易企业的实际组织架构:

管理员功能

  • 👥 员工管理:管理销售团队信息
  • 🏢 部门管理:设置组织架构
  • 📦 产品管理:维护产品信息库
  • 📊 销售订单:跟踪所有订单状态
  • 🚚 配送管理:监控物流配送

员工功能

  • 👤 客户管理:维护客户档案
  • 💼 销售跟进:记录客户沟通
  • 📦 订单处理:创建和跟踪订单
  • 📞 售后回访:客户关怀和反馈收集

3.2 数据库设计心得

数据库设计真的是个技术活!我前前后后改了不下十遍。特别是订单状态流转这块,要考虑各种业务场景:

-- 销售订单表的设计
CREATE TABLE sales_order (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_number VARCHAR(50) UNIQUE,      -- 订单编号
    customer_id BIGINT,                   -- 客户ID
    product_id BIGINT,                    -- 产品ID
    quantity INT,                         -- 数量
    unit_price DECIMAL(10,2),            -- 单价
    total_amount DECIMAL(10,2),          -- 总金额
    order_status TINYINT,                -- 订单状态
    create_time DATETIME,                -- 创建时间
    delivery_date DATE,                  -- 交货日期
    invoice_info VARCHAR(200)            -- 发票信息
);

四、核心功能实现:代码的实战之旅

4.1 客户管理模块

客户是贸易企业的核心资产,所以客户管理功能一定要做得贴心实用!👥

客户控制器代码示例

@RestController
@RequestMapping("/api/customer")
public class CustomerController {
    
    @Autowired
    private CustomerService customerService;
    
    /**
     * 添加新客户
     * 这个功能销售员每天都要用,一定要简单易用!
     */
    @PostMapping("/add")
    public ResponseEntity<?> addCustomer(@RequestBody CustomerDTO customerDTO,
                                        @RequestHeader("userId") Long userId) {
        try {
            // 参数校验
            if (StringUtils.isEmpty(customerDTO.getCustomerName())) {
                return ResponseEntity.badRequest().body("客户名称不能为空哦!😅");
            }
            
            // 重复客户检查
            if (customerService.isCustomerExists(customerDTO.getCustomerName())) {
                return ResponseEntity.badRequest().body("该客户已存在,请勿重复添加!");
            }
            
            // 保存客户信息
            Customer customer = customerService.saveCustomer(customerDTO, userId);
            return ResponseEntity.ok("客户添加成功!🎉 客户编号:" + customer.getCustomerCode());
            
        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                .body("添加客户失败:" + e.getMessage());
        }
    }
    
    /**
     * 获取客户列表(带分页和搜索)
     */
    @GetMapping("/list")
    public ResponseEntity<?> getCustomerList(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(required = false) String keyword) {
        try {
            PageResult<CustomerVO> result = customerService.getCustomerList(page, size, keyword);
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                .body("获取客户列表失败:" + e.getMessage());
        }
    }
}

4.2 销售订单管理

订单管理是贸易业务的核心,我设计了一个完整的订单生命周期管理:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private ProductMapper productMapper;
    
    /**
     * 创建销售订单
     * 这里要考虑库存检查、价格计算等业务逻辑
     */
    @Override
    public SalesOrder createOrder(OrderCreateDTO orderDTO, Long userId) {
        // 1. 验证产品库存
        Product product = productMapper.selectById(orderDTO.getProductId());
        if (product == null) {
            throw new RuntimeException("产品不存在!");
        }
        if (product.getStockQuantity() < orderDTO.getQuantity()) {
            throw new RuntimeException("产品库存不足!当前库存:" + product.getStockQuantity());
        }
        
        // 2. 生成订单编号
        String orderNumber = generateOrderNumber();
        
        // 3. 计算订单金额
        BigDecimal totalAmount = product.getPrice().multiply(
            new BigDecimal(orderDTO.getQuantity()));
        
        // 4. 创建订单
        SalesOrder order = new SalesOrder();
        order.setOrderNumber(orderNumber);
        order.setCustomerId(orderDTO.getCustomerId());
        order.setProductId(orderDTO.getProductId());
        order.setQuantity(orderDTO.getQuantity());
        order.setUnitPrice(product.getPrice());
        order.setTotalAmount(totalAmount);
        order.setOrderStatus(1); // 待处理
        order.setCreateTime(new Date());
        order.setCreateUser(userId);
        
        orderMapper.insert(order);
        
        // 5. 更新产品库存
        product.setStockQuantity(product.getStockQuantity() - orderDTO.getQuantity());
        productMapper.updateById(product);
        
        return order;
    }
    
    /**
     * 生成订单编号
     * 格式:SO202405150001
     */
    private String generateOrderNumber() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateStr = sdf.format(new Date());
        // 查询当天的订单数量
        int dailyCount = orderMapper.selectTodayOrderCount();
        return "SO" + dateStr + String.format("%04d", dailyCount + 1);
    }
}

4.3 售后回访功能

售后服务是维护客户关系的重要环节,我设计了一个智能的回访提醒系统:

@Component
public class AfterSalesScheduler {
    
    @Autowired
    private AfterSalesService afterSalesService;
    
    /**
     * 每天检查需要回访的订单
     * 这个定时任务真的很实用!
     */
    @Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
    public void checkVisitReminders() {
        List<SalesOrder> ordersToVisit = afterSalesService.getOrdersNeedVisit();
        
        for (SalesOrder order : ordersToVisit) {
            // 创建回访任务
            AfterSalesVisit visit = new AfterSalesVisit();
            visit.setOrderId(order.getId());
            visit.setCustomerId(order.getCustomerId());
            visit.setPlanVisitDate(new Date());
            visit.setStatus(0); // 待回访
            
            afterSalesService.saveVisit(visit);
            
            // 可以集成消息推送,提醒销售人员进行回访
            sendVisitReminder(order.getCreateUser(), order.getOrderNumber());
        }
    }
}

五、前端界面:用户体验的贴心设计

5.1 仪表盘设计

为不同角色设计了专属的仪表盘:

  • 销售员仪表盘:重点关注我的客户、待处理订单、回访提醒
  • 管理员仪表盘:公司整体销售数据、员工业绩统计、库存预警

5.2 响应式布局

使用现代化的前端技术,确保在电脑、平板、手机上都有一致的用户体验。销售员外出拜访客户时,用手机就能随时查看客户信息和订单状态。

5.3 操作流程优化

  • 一键操作:重要的业务操作都提供快捷方式
  • 智能提示:操作成功或失败都有明确的反馈
  • 数据可视化:用图表展示销售趋势,让数据更直观

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

六、开发过程中的挑战与突破

6.1 业务逻辑复杂性

贸易业务的流程比较复杂,从客户开发→报价→订单→发货→收款→售后,每个环节都要考虑周全。我通过绘制业务流程图,逐个突破每个环节的技术难点。

6.2 数据一致性保障

在订单处理过程中,要同时更新订单状态和库存数量,这里使用了Spring的事务管理来保证数据的一致性:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    // 使用@Transactional注解确保订单创建和库存更新要么都成功,要么都失败
    @Override
    public SalesOrder createOrder(OrderCreateDTO orderDTO, Long userId) {
        // 业务逻辑...
    }
}

6.3 性能优化

随着数据量的增加,查询速度变慢的问题逐渐显现。我通过添加数据库索引、优化SQL语句、使用缓存等技术手段,显著提升了系统性能。

七、系统测试:质量保证的坚实防线

测试环节我真的是下足了功夫!主要从几个方面进行:

7.1 功能测试

  • ✅ 客户管理全流程测试
  • ✅ 订单创建和状态流转测试
  • ✅ 库存扣减和回滚测试
  • ✅ 权限控制测试

7.2 性能测试

模拟了100个用户同时使用系统,各项功能都运行正常,响应时间都在可接受范围内。

7.3 安全测试

特别测试了权限控制,确保员工只能访问自己权限范围内的数据,管理员可以管理所有数据。

八、收获与成长

8.1 技术能力的提升

  • 深入掌握了Spring Boot开发实战
  • 学会了复杂业务系统的分析和设计
  • 理解了数据库设计和性能优化
  • 掌握了系统部署和运维技能

8.2 项目管理的体会

  • 需求分析要细致:开始没理解清楚贸易业务逻辑,中途返工了好几次
  • 代码规范很重要:良好的代码结构和注释让后期维护轻松很多
  • 版本控制是生命线:Git在团队协作中真的太重要了
  • 测试要尽早:越早发现bug,修复成本越低

开发这个贸易CRM系统的经历让我真正理解了企业级应用的开发流程,从业务理解到技术实现,每个环节都是新的学习。如果我的经验对你有启发,欢迎交流讨论!