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

news2024/10/7 6:50:29

在这里插入图片描述


目录

  • 一、摘要
    • 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. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术原理及应用课实验3 :熟悉常用的HBase操作

目录 实验3 熟悉常用的HBase操作 一、实验目的 二、实验平台 三、实验步骤&#xff08;每个步骤下均需有运行截图&#xff09; &#xff08;一&#xff09;编程实现以下指定功能&#xff0c;并用Hadoop提供的HBase Shell命令完成相同任务&#xff1a; 1.列出HBase所有的表…

人工智能攻克奥数几何难题:AlphaGeometry 接近金牌选手水平

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

直流过欠压继电器JSZD-1A DC220V 0-220V 面板嵌入式安装

一、 概述 JSZD-1系列直流电压继电器是专为直流系统设计的&#xff0c;以进口大规模集成电路为核心&#xff0c;配以本厂研制的模块和部分外围元件组装而成。具有通用性好、互换性强、寿命长、外形美观大方、性能稳定可靠等特点。 JSZD-1系列直流电压继电器既是一块过、欠压继…

Docker(八)高级网络配置

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 高级网络配置 注意&#xff1a;本章属于 Docker 高级配置&#xff0c;如果您是初学者&#xff0c;您可以暂时跳过本章节&#xff0c;直接学习…

Linux重定向:深入理解与实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;晴る—ヨルシカ 0:20━━━━━━️&#x1f49f;──────── 4:30 &#x1f504; ◀️ ⏸ ▶️ ☰ &…

力扣hot100 相交链表 思维题

Problem: 160. 相交链表 文章目录 思路复杂度&#x1f496; Ac Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f469;‍&#x1f3eb; 参考图解 复杂度 时间复杂度: O ( n m ) O(nm) O(nm) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( 1 ) O(1) O(…

2024年第十二届亚洲机械与材料工程国际会议(ACMME 2024)即将召开!

时间&#xff1a;2024年6月14-17日 地点&#xff1a;日本京都先端科学大学太秦校区 会议官网&#xff1a;第11届ACMME |日本京都 2024年第十二届亚洲机械与材料工程会议 &#xff08;ACMME 2024&#xff09;将于2024年6月14日-17日在日本京都先端科学大学召开。亚洲机械与材料…

三、arcgispro二次开发创建第一个工程

忙了几天&#xff0c;总算可以创建第一工程了。 步骤一&#xff1a; 步骤二&#xff1a; 工具介绍&#xff1a; 项目创建成功&#xff1a;项目目录在解决方案资源管理器中&#xff0c;整个工具都是动态可调整的&#xff0c;如下图&#xff1a; 想把窗口放哪里就把鼠标移到红…

CorelDRAW Graphics Suite2024专业图形设计软件Mac/Windows版

以激情为创造动力&#xff0c;以目的为设计导向。“对专业的图形设计人士来说&#xff0c;CorelDRAW 是市面上最易于使用的软件。 我用它设计过标牌、横幅、T 恤&#xff0c;甚至 45 英尺长的房车图形&#xff01;” 使用 CorelDRAW 全新的聚焦模式&#xff0c;现在可以单独编…

[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

Ubuntu系统pycharm以及annaconda的安装配置笔记以及问题集锦(更新中)

Ubuntu 22.04系统pycharm以及annaconda的安装配置笔记以及问题集锦 pycharm安装 安装完之后桌面上并没有生成图标 后面每次启动pycharm都要到它的安装路径下的bin文件夹下&#xff0c; cd Downloads/pycharm-2018.1.4/bin然后使用sh命令启动脚本程序来打开pycharm sh pycha…

FindMy技术与相机结合

FindMy是苹果公司提供的设备追踪服务&#xff0c;用来帮助用户定位丢失的设备。自苹果公司开放Findmy网络之后&#xff0c;FindMy技术便与各种生活设备相结合&#xff0c;比如与相机的结合。 想象一下&#xff0c;你正在外出办事或者旅行时&#xff0c;突然意识到相机丢了&…

vectorCast——CBA功能实现代码手动覆盖

选择被测文件&#xff0c;点击右键&#xff0c;选择add coverage analysis.选择添加覆盖分析后&#xff0c;会自动打开CBA。此时就可以在代码里选择没有覆盖的代码&#xff0c;勾选后填写未覆盖分析并保存&#xff0c;就可以实现代码覆盖了。查看覆盖率报告。 手动覆盖代码完成…

uniapp组件库Popup 弹出层 的使用方法

目录 #平台差异说明 #基本使用 #设置弹出层的方向 #设置弹出层的圆角 #控制弹窗的宽度 | 高度 #内容局部滚动 #API #Props #Event 弹出层容器&#xff0c;用于展示弹窗、信息提示等内容&#xff0c;支持上、下、左、右和中部弹出。组件只提供容器&#xff0c;内部内容…

C语言总结十一:自定义类型:结构体、枚举、联合(共用体)

本篇博客详细介绍C语言最后的三种自定义类型&#xff0c;它们分别有着各自的特点和应用场景&#xff0c;重点在于理解这三种自定义类型的声明方式和使用&#xff0c;以及各自的特点&#xff0c;最后重点掌握该章节常考的考点&#xff0c;如&#xff1a;结构体内存对齐问题&…

Java 数组原理内存图

Java 虚拟机的内存划分 为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域都有特定的处理数据方式和内存管理方式。 JVM 的内存划分 数组在内存中的存储 一个数组内存图 public static void main(String[] args) {int[] nums new int[] {1…

64位ATT汇编语言as汇编ld链接,执行报错Segmentation fault

absCallAndPrintAbsAsLd.s里边的内容如下&#xff1a; .section .datastringToShow:.ascii "The abs of number is %d\n\0" .global _start .section .text _start:pushq %rbpmovq %rsp,%rbpmovq $-5,%rdicall absmovq $stringToShow,%rdimovq %rax,%rsicall printf…

鸿蒙星河版启航,开发者驶入生态新征程

操作系统市场的气候已经不同以往。在鸿蒙决定不再兼容安卓之后&#xff0c;这里正欲长出一片全新的天地。 四年前&#xff0c;华为鸿蒙系统横空出世&#xff0c;彼时它还不完全与安卓和iOS的性质划等号&#xff0c;而是定义为物联网操作系统。而如今的华为鸿蒙要改写故事篇章&…

关于C语言整型提升的讲解

目录 1.什么是整型提升 2.整型提升的意义 3.整型提升是怎么提升的 4.整型提升的实例 1.什么是整型提升 C语言中的整型算术运算总是以缺省&#xff08;默认&#xff09;整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前会被转换…

go语言(十一)----面向对象继承

一、面向对象继承 写一个父类 package mainimport "fmt"type Human struct {name stringsex string }func (this *Human) Eat() {fmt.Println("Human.Eat()...") }func (this *Human) Walk() {fmt.Println("Human.Walk()...") }func main() {h…