一个功能完整的现代化客户关系管理系统,采用前后端分离架构。
| 层级 | 技术 |
|---|---|
| 后端 | Spring Boot 2.7.18 + Spring Security + JWT + MyBatis-Plus |
| 前端 | Vue 2.6.14 + Element UI + Vuex + Vue Router + Axios |
| 数据库 | MySQL 8.0+ |
Windows 下载命令(使用 Chocolatey):
# 首先安装 Chocolatey(如果未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装 JDK
choco install openjdk8 -y验证安装:
java -version
# 应输出: openjdk version "1.8.x_xxx"Windows 下载命令(使用 Chocolatey):
choco install maven -y验证安装:
mvn -version
# 应输出: Apache Maven 3.x.xWindows 下载命令(使用 Chocolatey):
choco install nodejs -y验证安装:
node -v
# 应输出: v14.x.x 或更高
npm -v
# 应输出: 6.x.x 或更高Windows 下载地址:
https://dev.mysql.com/downloads/mysql/
选择 MySQL Installer for Windows 下载安装。
验证安装:
mysql --version
# 应输出: mysql Ver 8.0.xnpm config set registry https://registry.npmmirror.com
npm config get registry
# 应输出: https://registry.npmmirror.comgit clone https://gitee.com/haobinjun/easy-crm-system.git
cd easy-crm-systemmysql -u root -p
# 输入你的 MySQL 密码CREATE DATABASE easy_crm CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE easy_crm;CREATE TABLE crm_user (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码',
real_name VARCHAR(50) COMMENT '真实姓名',
phone VARCHAR(20) COMMENT '手机号',
email VARCHAR(100) COMMENT '邮箱',
role VARCHAR(20) DEFAULT 'USER' COMMENT '角色: ADMIN/USER',
status TINYINT DEFAULT 1 COMMENT '状态: 1启用 0禁用',
deleted TINYINT DEFAULT 0 COMMENT '删除标记: 0未删 1已删',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';CREATE TABLE crm_customer_grade (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '等级ID',
grade_name VARCHAR(50) NOT NULL COMMENT '等级名称',
grade_level INT NOT NULL COMMENT '等级级别',
discount DECIMAL(5,2) DEFAULT 1.00 COMMENT '折扣率',
deleted TINYINT DEFAULT 0 COMMENT '删除标记',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户等级表';CREATE TABLE crm_customer_tag (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '标签ID',
tag_name VARCHAR(50) NOT NULL COMMENT '标签名称',
tag_color VARCHAR(20) COMMENT '标签颜色',
deleted TINYINT DEFAULT 0 COMMENT '删除标记',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户标签表';CREATE TABLE crm_customer (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '客户ID',
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
gender VARCHAR(10) COMMENT '性别',
phone VARCHAR(20) COMMENT '手机号',
email VARCHAR(100) COMMENT '邮箱',
wechat VARCHAR(50) COMMENT '微信号',
company VARCHAR(200) COMMENT '公司名称',
position VARCHAR(100) COMMENT '职位',
industry VARCHAR(100) COMMENT '行业',
source_channel VARCHAR(50) COMMENT '来源渠道',
customer_type VARCHAR(20) DEFAULT 'POTENTIAL' COMMENT '客户类型',
grade_id BIGINT COMMENT '客户等级ID',
status VARCHAR(20) DEFAULT 'NEW' COMMENT '客户状态',
address VARCHAR(500) COMMENT '地址',
remark VARCHAR(1000) COMMENT '备注',
owner_id BIGINT COMMENT '负责人ID',
follow_count INT DEFAULT 0 COMMENT '跟进次数',
last_follow_time DATETIME COMMENT '最后跟进时间',
consume_score INT DEFAULT 50 COMMENT '消费力评分',
active_score INT DEFAULT 50 COMMENT '活跃度评分',
loyalty_score INT DEFAULT 50 COMMENT '忠诚度评分',
potential_score INT DEFAULT 50 COMMENT '潜力评分',
satisfaction_score INT DEFAULT 50 COMMENT '满意度评分',
deleted TINYINT DEFAULT 0 COMMENT '删除标记',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (grade_id) REFERENCES crm_customer_grade(id),
FOREIGN KEY (owner_id) REFERENCES crm_user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';CREATE TABLE crm_follow_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
customer_id BIGINT NOT NULL COMMENT '客户ID',
follow_user_id BIGINT NOT NULL COMMENT '跟进人ID',
follow_method VARCHAR(20) COMMENT '跟进方式: PHONE/MEETING/WECHAT/EMAIL',
follow_content TEXT COMMENT '跟进内容',
next_plan VARCHAR(500) COMMENT '下一步计划',
next_follow_time DATETIME COMMENT '下次跟进时间',
customer_demand VARCHAR(500) COMMENT '客户需求',
follow_status VARCHAR(20) DEFAULT 'COMPLETED' COMMENT '跟进状态',
deleted TINYINT DEFAULT 0 COMMENT '删除标记',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (customer_id) REFERENCES crm_customer(id),
FOREIGN KEY (follow_user_id) REFERENCES crm_user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跟进记录表';CREATE TABLE crm_sales_funnel (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '漏斗ID',
customer_id BIGINT NOT NULL COMMENT '客户ID',
stage VARCHAR(50) COMMENT '阶段',
amount DECIMAL(15,2) COMMENT '金额',
probability INT COMMENT '成交概率',
expected_deal_date DATE COMMENT '预计成交日期',
remark VARCHAR(500) COMMENT '备注',
deleted TINYINT DEFAULT 0 COMMENT '删除标记',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (customer_id) REFERENCES crm_customer(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售漏斗表';INSERT INTO crm_user (username, password, real_name, role) VALUES
('admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '系统管理员', 'ADMIN');INSERT INTO crm_customer_grade (grade_name, grade_level, discount) VALUES
('普通客户', 1, 1.00),
('重点客户', 2, 0.95),
('VIP客户', 3, 0.90);INSERT INTO crm_customer_tag (tag_name, tag_color) VALUES
('潜在客户', '#409EFF'),
('高意向', '#67C23A'),
('待跟进', '#E6A23C'),
('已成交', '#F56C6C');EXIT;编辑 crm-backend/src/main/resources/application.yml,修改数据库用户名和密码:
spring:
datasource:
url: jdbc:mysql://localhost:3306/easy_crm?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root # 改成你的 MySQL 用户名
password: your_password # 改成你的 MySQL 密码方式一:使用 Maven 命令
cd crm-backend
mvn clean install
mvn spring-boot:run方式二:使用 IDE
- 用 IntelliJ IDEA 打开
crm-backend目录 - 运行
CrmBackendApplication.java
成功标志:控制台输出 Started CrmBackendApplication
新开一个命令行窗口:
cd crm-frontend
# 首次运行需要安装依赖
npm install
# 启动开发服务器
npm run dev成功标志:浏览器自动打开 http://localhost:5174
用户名: admin
密码: admin123
easy-crm-system/
├── crm-backend/ # Spring Boot 后端
│ ├── src/main/java/com/easy/crm/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # REST API
│ │ ├── service/ # 业务逻辑
│ │ ├── mapper/ # 数据访问
│ │ ├── entity/ # 实体类
│ │ ├── dto/ # 数据传输对象
│ │ ├── filter/ # JWT 过滤器
│ │ └── exception/ # 异常处理
│ └── src/main/resources/
│ ├── application.yml # 配置文件
│ └── mapper/ # MyBatis 映射
│
├── crm-frontend/ # Vue 前端
│ ├── src/
│ │ ├── api/ # API 封装
│ │ ├── components/ # 公共组件
│ │ ├── router/ # 路由配置
│ │ ├── store/ # Vuex 状态管理
│ │ ├── utils/ # 工具函数
│ │ └── views/ # 页面组件
│ └── public/
│
└── README.md # 本文档
| 问题 | 解决方案 |
|---|---|
| 后端启动失败,提示连接数据库失败 | 检查 MySQL 服务是否启动,核对 application.yml 中的用户名密码 |
| 前端 npm install 很慢 | 使用国内镜像: npm config set registry https://registry.npmmirror.com |
| 端口被占用 | 修改 application.yml 中的 server.port 或 vite.config.js 中的端口 |
| 登录后提示 401 未授权 | 检查后端是否正常启动,JWT 密钥配置是否正确 |
| 服务 | 端口 | 地址 |
|---|---|---|
| 后端 | 8081 | http://localhost:8081 |
| 前端 | 5174 | http://localhost:5174 |
| MySQL | 3306 | localhost:3306 |
如有问题,请提交 Issue 或联系维护者。
License: MIT