【开源】基于JAVA语言的CRM客户管理系统

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
  • 三、系统设计
    • 3.1 用例设计
    • 3.2 E-R 图设计
    • 3.3 数据库设计
      • 3.3.1 客户表
      • 3.3.2 商品表
      • 3.3.3 客户跟踪表
      • 3.3.4 客户消费表
      • 3.3.5 系统角色表
  • 四、系统展示
  • 五、核心代码
    • 5.1 查询客户
    • 5.2 新增客户跟踪记录
    • 5.3 新增客户消费订单
    • 5.4 查询商品
    • 5.5 商品购买
  • 六、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的CRM客户管理系统,包含了客户管理、客户分析、商品管理、客户跟踪、客户消费模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,CRM客户管理系统基于角色的访问控制,给客户管理员、工作人员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

1.2 项目录屏


二、功能模块

CRM客户管理系统的系统设计是一个基于系统分析结果的过程,使用科学的系统理念和方法来设计一个新系统,该系统可以最大限度地实现所需的目的。系统设计主要是功能设计,创建理想系统并制定设计计划;将系统划分为若干子系统;子系统和整个系统的详细设计和评估;演示系统方案并预测性能效果,本系统主要从五个功能模块分析。

  1. 首先是客户管理模块,主要实现用户的增删改查,对客户信息进行快速、准确的记录和查询操作,标记客户信息并对它进行分类,每个客户都具有唯一的编号,姓名,联系方式等基本信息,同时还有客户类型,客户状态等附加信息,能够导出客户信息。

  2. 第二是客户跟踪模块,该模块主要就是对潜在客户进行跟踪,记录跟踪内容和对跟踪信息增删改查,每个客户的跟踪记录包括跟踪日期、跟踪人、跟进内容等信息。

  3. 第三是客户消费模块,记录客户的消费情况,对客户的消费记录进行增删改查,同时也能导出客户消费记录信息到本地。

  4. 第四是商品管理模块,包括商品信息的增删改查、商品分类、商品库存管理等功能。

  5. 第五是系统基础模块,该模块包含若干子功能,但是该功能模块只有管理员角色可以操作。

在这里插入图片描述


三、系统设计

3.1 用例设计

在这里插入图片描述

3.2 E-R 图设计

在这里插入图片描述

3.3 数据库设计

3.3.1 客户表

在这里插入图片描述

3.3.2 商品表

在这里插入图片描述

3.3.3 客户跟踪表

在这里插入图片描述

3.3.4 客户消费表

在这里插入图片描述

3.3.5 系统角色表

在这里插入图片描述


四、系统展示

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


五、核心代码

5.1 查询客户

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询客户")
public Result<IPage<Customer>> getByPage(@ModelAttribute Customer customer ,@ModelAttribute PageVo page){
    QueryWrapper<Customer> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(customer.getType())) {
        qw.eq("type",customer.getType());
    }
    if(!ZwzNullUtils.isNull(customer.getTitle())) {
        qw.like("title",customer.getTitle());
    }
    IPage<Customer> data = iCustomerService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Customer>>().setData(data);
}

5.2 新增客户跟踪记录

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增客户跟踪")
public Result<CustomerItem> insert(CustomerItem customerItem){
    Customer customer = iCustomerService.getById(customerItem.getCustomerId());
    if(customer == null) {
        return ResultUtil.error("客户不存在");
    }
    User currUser = securityUtil.getCurrUser();
    customerItem.setCustomerName(customer.getTitle());
    customerItem.setDate(DateUtil.now());
    customerItem.setUserId(currUser.getId());
    customerItem.setUserName(currUser.getNickname());
    iCustomerItemService.saveOrUpdate(customerItem);
    return new ResultUtil<CustomerItem>().setData(customerItem);
}

5.3 新增客户消费订单

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增客户消费")
public Result<CustomerOrder> insert(CustomerOrder customerOrder){
    Customer customer = iCustomerService.getById(customerOrder.getUserId());
    if(customer == null) {
        return ResultUtil.error("客户不存在");
    }
    customerOrder.setUserName(customer.getTitle());
    Commodity commodity = iCommodityService.getById(customerOrder.getCommodityId());
    if(commodity == null) {
        return ResultUtil.error("商品不存在");
    }
    if(commodity.getNumber() == null) {
        commodity.setNumber(BigDecimal.ZERO);
    }
    if(customerOrder.getNumber().compareTo(commodity.getNumber()) > 0) {
        return ResultUtil.error("库存不足");
    }
    commodity.setNumber(commodity.getNumber().subtract(customerOrder.getNumber()));
    iCommodityService.saveOrUpdate(commodity);
    customerOrder.setTitle(commodity.getTitle());
    customerOrder.setType(commodity.getType());
    customerOrder.setPrice(commodity.getPrice());
    customerOrder.setImage(commodity.getImage());
    customerOrder.setUserId(customer.getId());
    customerOrder.setUserName(customer.getTitle());
    customerOrder.setDate(DateUtil.now());
    iCustomerOrderService.saveOrUpdate(customerOrder);
    return new ResultUtil<CustomerOrder>().setData(customerOrder);
}

5.4 查询商品

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询商品")
public Result<IPage<Commodity>> getByPage(@ModelAttribute Commodity commodity ,@ModelAttribute PageVo page){
    QueryWrapper<Commodity> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(commodity.getTitle())) {
        qw.like("title",commodity.getTitle());
    }
    if(!ZwzNullUtils.isNull(commodity.getType())) {
        qw.eq("type",commodity.getType());
    }
    IPage<Commodity> data = iCommodityService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Commodity>>().setData(data);
}

5.5 商品购买

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增商品购买")
public Result<CommodityBuy> insert(CommodityBuy commodityBuy){
    Commodity commodity = iCommodityService.getById(commodityBuy.getCommodityId());
    if(commodity == null) {
        return ResultUtil.error("商品不存在");
    }
    User currUser = securityUtil.getCurrUser();
    commodityBuy.setTitle(commodity.getTitle());
    commodityBuy.setType(commodity.getType());
    commodityBuy.setPrice(commodity.getPrice());
    commodityBuy.setImage(commodity.getImage());
    commodityBuy.setUserId(currUser.getId());
    commodityBuy.setUserName(currUser.getNickname());
    commodityBuy.setDate(DateUtil.now());
    iCommodityBuyService.saveOrUpdate(commodityBuy);
    if(commodity.getNumber() == null) {
        commodity.setNumber(BigDecimal.ZERO);
    }
    commodity.setNumber(commodity.getNumber().add(commodityBuy.getNumber()));
    iCommodityService.saveOrUpdate(commodity);
    return new ResultUtil<CommodityBuy>().setData(commodityBuy);
}

六、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338125.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM(上)

目录 一、JVM概述 一、JVM作用 二、JVM整体组成部分 二、JVM结构-类加载 一、类加载子系统概述 二、类加载过程 1.加载 2.链接 3.初始化&#xff08;类加载过程中的初始化&#xff09; 三、类加载器分类 大致分两类&#xff1a; 细致分类&#xff1a; 四、双亲委派机制 五、打…

【记录一下】【年底清洗抽油烟机---被套路了540块钱!!!】年底了,注意各种套路【警惕,不然钱没没!!!】

■事情结果 被骗&#xff08;啊&#xff0c;不是被骗&#xff0c;是被套路&#xff09;了360块钱 13050558273&#xff08;诈骗者&#xff0c;啊不能算是诈骗&#xff0c;是下套的清洗油烟机的吴某的电话&#xff09; 4008731099&#xff08;这个电话不是方太的客服电话&…

数据操作——Column 对象

Column 对象 1. 什么是Column对象 Column 表示了 Dataset 中的一个列, 并且可以持有一个表达式, 这个表达式作用于每一条数据, 对每条数据都生成一个值 2.Column对象如何创建 ’ 单引号 ’ 在 Scala 中是一个特殊的符号, 通过 ’ 会生成一个 Symbol 对象, Symbol 对象可以理…

优先级队列(堆) PriorityQueue

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.优先级队列 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的创建 2.3 堆的插入和删除 2.…

数据结构——二叉树

目录 一、前言 1.1 树 1.2 树的相关概念 二、二叉树 2.1 定义 2.2 特殊类型 2.3 二叉树的性质 2.4 二叉树的存储结构 &#xff08;1&#xff09;顺序存储 &#xff08;2&#xff09;链式存储 三、二叉树相关操作 3.1 创建一颗二叉树 3.2 二叉树的遍历 &#xff…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…

JVM对象创建与内存回收机制

对象的创建过程有如下步骤&#xff1a; 1.类加载检查&#xff1a; 虚拟机遇到一个new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过&#xff0c;如果没…

带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍

Hqst华轩盛(石门盈盛)电子导读&#xff1a;一起来了解带POE网络变压器与2.5G/5G/10G网络变压器产品特点&#xff1f; 一﹑带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍 首先、POE网络变压器产品与常规不带POE产品的区别&#xff1a; 带POE网络变压器主要要求是耐电流等…

mycat实现mysql读写分离

一. mycat集群HaproxyKeepalived mycat集群HaproxyKeepalivedmysql1主2从 环境规划 centos7.9 1主2从&#xff0c;读写分离 名称ip端口mysql-master192.168.1.2203306mysql-slave1192.168.1.2213306mysql-slave2192.168.1.2223306mycat-1192.168.1.2218066mycat-2192.168.1.…

【学习笔记】遥感影像分类相关精度指标

文章目录 0.混淆矩阵1. 精度名词解释2. Kappa系数3.举个栗子参考资料 0.混淆矩阵 混淆矩阵是分类精度的评定指标。是一个用于表示分为某一类别的像元个数与地面检验为该类别数的比较阵列。 对检核分类精度的样区内所有的像元&#xff0c;统计其分类图中的类别与实际类别之间的…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

JAVA和C++ SECS/GEM300开发和概念

编译SECS示例程序 1. 示例程序使用默认路径&#xff1a; D:\SECS 稳定版\SECS Debug\ 2. 该操作分为俩步 ① 将C#的Secs库编译成设备相同Net版本。 如.net3.5、4.0、4.5等等 ② 编译金南瓜SECS demo程序 编译C#的SecsEquip.dll 1. 找到SecsEquip项目 项目文件 使用Visua…

python24.1.21面向对象编程

面向对象编程&#xff1a;创建对象&#xff0c;定义对象的方法和属性 封装&#xff1a;隐藏内部实现细节&#xff0c;只通过外部接口访问使用 继承&#xff1a;允许创建有层次的类&#xff08;子类&#xff0c;父类&#xff09; 多态&#xff1a;同样接口&#xff0c;对象具体…

力扣343. 整数拆分(动态规划)

Problem: 343. 整数拆分 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题目可以抽象成动态规划中的爬楼梯模型&#xff0c;将整数的拆分类比为上台阶&#xff1a; 1.每个阶段可以从整数中划分出1、2、…k的一个整数 2.int dp[n 1] dp[i]表示为i的整数划分的最大…

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例&#xff0c;并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell&#xff0c;并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…

一个很牛的库:csckit!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是Python csvkit&#xff1f;二、csvkit 的主要特点三、安装Python csvkit四 基本用法读取CSV文件五使用Python库进行高级操作总结 前言 大家好&#…

Oracle篇—参数文件在11gRAC或12cRAC的启动位置介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候&#xff0c;很有可能会报错&#xff1a; Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

分布式锁的产生以及使用

日常开发中&#xff0c;针对一些需要锁定资源的操作&#xff0c;例如商城的订单超卖问题、订单重复提交问题等。 都是为了解决在资源有限的情况限制客户端的访问&#xff0c;对应的是限流。 单节点锁问题 目前针对这种锁资源的情况采取的往往是互斥锁&#xff0c;例如 java 里…

Node+Express编写接口---前端

前端页面 vue_node_admin: 第一个以node后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/vue_node_admin.git