拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java CRM毕设实战:JSP+MySQL从环境搭建到功能落地

Java CRM毕设实战:JSP+MySQL从环境搭建到功能落地

简介:这份资源是面向计算机专业学生与Java初学者的一份客户关系管理系统毕业设计文档,聚焦于如何用主流技术栈完成一套可运行的CRM系统方案。文档围绕B/S架构展开,涵盖需求可行性分析、数据库表结构规划、客户信息管理、销售机会跟踪与服务请求处理等功能模块设计,并配有主要功能界面截图与操作说明,便于读者理解系统从设计到测试的完整流程。资源包共1个docx文件,约3.84MB,内容为完整的论文式文档,包含绪论、系统实现与测试等章节,适合作为课程设计或毕业设计的参考模板。目前已有71人学习下载,读者可从中获取系统架构思路、数据库设计方法与模块划分经验,并借鉴其测试与维护的写作框架,快速搭建自己的开发方案。

1. 从一份 Java CRM 毕设文档说起:它到底能跑出什么

如果你手头正压着一个「客户关系管理系统」的课程设计或毕设任务,又不想从零去啃 Spring 全家桶,那这份基于 Java 的 CRM 设计与实现文档值得先翻一遍。它给的不是一个空壳目录,而是一套能落地的 B/S 结构方案:IDEA 里写 Java,JSP 做页面,MySQL 存数据,Tomcat 发布到浏览器访问。管理员和普通用户两种角色,覆盖客户信息、产品信息、合同订单、财务、人事、信息中心这几块业务。说白了,它解决的是「传统人工登记客户资料、翻纸质台账找订单」这类低效场景,适合课程设计交差、也适合小团队拿来当二次开发的底子。下面我按「这东西是什么 → 怎么把它跑起来 → 哪里容易翻车」的顺序拆一遍。

2. 技术选型拆解:为什么是 JSP + MySQL 而不是 Spring Boot

2.1 B/S 结构与 JSP 的取舍逻辑

这套系统选的是 B/S 模式,用户不用装客户端,浏览器输地址就能用。放在当年或者教学场景里,这个选择很务实:C/S 要下载安装包,步骤一多用户就跑了,B/S 把门槛压到最低。页面层用 JSP,原理是服务端把 JSP 里的 Java 代码片段和 HTML 一起解释成静态 HTML 再吐给浏览器。它的好处是上手快,<% %>里直接写逻辑,配合 JavaBean 就能把数据从后台带到页面。

但这里有个边界要说清楚:JSP 适合页面逻辑不复杂的教学项目,一旦业务膨胀,页面里混着 SQL 和 Java 代码会变成维护噩梦。所以这份文档的定位很明确——中小型系统、功能模块清晰、以演示和答辩为主。如果你打算把它改成生产级系统,页面层迟早要换成前后端分离,但那是后话,先把这套跑通再说。

2.2 数据库表结构与实体关系

文档里数据库设计分了两步:概念设计画 E-R 图,逻辑设计转二维表。实体覆盖管理员、员工、客户、产品、合同、订单、站内信息、收款、发票、公告、新闻,一共十几个。以管理员表和员工表为例,字段设计是这样的:

表名关键字段类型说明
管理员信息表id / username / password / role / addtimeInt / String / String / String / Dateid 非空主键,其余可空
员工信息表id / username / password / yonghu_name / sex_typesInt / String / String / String / Integer账户、密码、姓名、性别

从字段能看出两个设计习惯:一是主键统一用自增 Int,二是时间字段用 Date 记录创建时间,方便后续按时间排序和追溯。客户表额外带了客户级别、客户来源、跟进方式这几个字段,这是 CRM 的核心——它不只是存个名字电话,而是把「这个客户值不值得跟、从哪来的、怎么跟」都结构化了。

2.3 环境搭建与项目导入步骤

要把这套东西跑起来,环境版本别乱配,教学项目对版本敏感。常见做法是 JDK 8、Tomcat 8.5、MySQL 5.7 这个组合,兼容性最稳。步骤如下:

第一步,装 JDK 并配环境变量。装完在命令行敲java -version,能出版本号才算成。

java -version # 期望输出类似:java version "1.8.0_xxx"

第二步,装 MySQL 5.7,建库并导入 SQL 脚本。脚本一般在项目的sql或db目录下,文件名类似crm.sql。

mysql -u root -p # 输入密码后进入 mysql 命令行 CREATE DATABASE crm_db DEFAULT CHARACTER SET utf8mb4; USE crm_db; SOURCE /你的路径/crm.sql;

第三步,IDEA 导入项目,配置 Tomcat。在 Run/Debug Configurations 里新增 Tomcat Server,Deployment 选项卡添加 Artifact,Application context 设成/crm之类,避免根路径冲突。

第四步,改数据库连接配置。JSP 项目通常把连接信息写在db.properties或某个工具类里,把库名、用户名、密码对上你本地环境。

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/crm_db?useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=你的密码

参数说明:useUnicode=true和characterEncoding=utf8这两个不加,中文客户名进库就是乱码,这是血泪经验。驱动类名注意是com.mysql.jdbc.Driver(5.x 版本),如果你换了 8.x 的驱动包,类名和 URL 都要跟着改,否则启动直接报找不到驱动。

3. 核心功能模块怎么落地:从登录到订单管理

3.1 注册登录与权限拦截

系统分管理员和用户两种角色,登录逻辑是典型的「查库比对 + Session 存状态」。用户提交账号密码后,后台拿 username 去对应表查记录,比对 password,成功就把用户信息塞进 Session,后续页面靠 Session 判断有没有登录、是什么角色。

// 登录校验核心逻辑(示意) String sql = "SELECT * FROM admin WHERE username=? AND password=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs = ps.executeQuery(); if (rs.next()) { session.setAttribute("admin", rs.getString("username")); session.setAttribute("role", rs.getString("role")); // 跳转后台首页 } else { // 回登录页并提示账号或密码错误 }

这里用PreparedStatement而不是拼字符串,是为了防 SQL 注入——客户名里带个单引号,拼接写法直接让 SQL 语法崩掉,预编译能挡住这类问题。权限拦截一般靠一个 Filter,在doFilter里判断 Session 里有没有角色信息,没有就踢回登录页。这一步别省,否则别人直接敲后台 URL 就能进。

3.2 客户信息与产品信息的增删改查

客户信息管理是这套系统的重头戏,功能就是增删改查加条件检索。新增客户时,表单字段对应客户表的列:客户姓名、性别、手机号、邮箱、身份证号、客户级别、客户来源、跟进方式。后台接收参数后执行 INSERT。

String sql = "INSERT INTO customer(name, sex, phone, email, level, source, follow_type, addtime) VALUES(?,?,?,?,?,?,?,NOW())"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, name); ps.setString(2, sex); ps.setString(3, phone); ps.setString(4, email); ps.setString(5, level); ps.setString(6, source); ps.setString(7, followType); ps.executeUpdate();

参数说明:NOW()让数据库自己填创建时间,比在 Java 里new Date()再格式化更省事,也避免时区不一致。产品信息管理结构类似,字段是产品名称、类型、价格、介绍、创建时间。查询列表页通常带分页,教学项目里常见的是LIMIT加偏移量,页码从 URL 参数拿。

3.3 合同订单与财务模块的关联

合同、订单、收款、发票这几块是串起来的。订单表里有签订客户、订单名称、金额、签订时间、订单详情;合同表有合同名称、签订客户、合同简介、申请时间。业务上一般是先有客户,再签合同,合同生成订单,订单产生收款和发票记录。这种链式关系在数据库里靠外键字段(客户编号、合同编号)关联,查询时用 JOIN 把客户名带出来。

SELECT o.order_name, o.amount, c.name AS customer_name, o.sign_time FROM orders o LEFT JOIN customer c ON o.customer_id = c.id WHERE o.sign_time BETWEEN ? AND ? ORDER BY o.sign_time DESC;

用LEFT JOIN而不是INNER JOIN,是为了防止客户记录被删后订单直接查不出来——虽然规范做法是逻辑删除,但教学项目里物理删除很常见,LEFT JOIN 至少能保住订单数据可见。财务模块的收款和发票各自独立成表,字段包含经手人、收款人、金额、公司名称、支付方式、备注,方便对账。

4. 避坑与排查:这套系统最容易翻车的五个地方

4.1 中文乱码:现象是页面显示问号,原因是编码链没统一

现象:客户姓名存进去变成???,或者页面显示乱码。原因:JSP 页面、数据库连接、数据库表三处编码不一致。解决:JSP 顶部加<%@ page contentType="text/html;charset=UTF-8" %>,连接 URL 带characterEncoding=utf8,建库时指定utf8mb4,三处对齐基本就好了。

4.2 数据库连接失败:现象是启动报错,原因是驱动或 URL 不匹配

现象:控制台抛ClassNotFoundException或Access denied。原因:驱动 jar 没放进WEB-INF/lib,或者驱动类名和 MySQL 版本对不上。解决:5.x 用com.mysql.jdbc.Driver,8.x 用com.mysql.cj.jdbc.Driver,URL 8.x 还要加时区参数serverTimezone=Asia/Shanghai。

4.3 Tomcat 端口占用:现象是启动闪退,原因是 8080 被占

现象:Tomcat 启动几秒就停,日志提示端口被占用。原因:本机 8080 被别的程序(比如另一个 Tomcat 或某 IDE 内置服务)占了。解决:改server.xml里的 Connector 端口,或者关掉占用进程。改完记得同步改访问地址。

4.4 页面 404:现象是能启动但访问不到,原因是 context path 没对上

现象:Tomcat 起来了,但访问localhost:8080/是 404。原因:Application context 配的不是根路径,实际访问要带上下文。解决:在 IDEA 的 Deployment 里确认 Application context,访问时带上,比如/crm/login.jsp。

4.5 权限越权:现象是普通用户能进后台,原因是拦截器漏配

现象:用普通账号登录后,手动改 URL 能进管理员页面。原因:Filter 只拦了部分路径,或者根本没配。解决:Filter 的urlPatterns覆盖后台所有页面,并在doFilter里按角色二次判断,别只判断「有没有登录」。

5. 二次开发与验证:怎么确认这套东西真能用

拿到这套代码,别急着改功能,先做一轮验证。我的习惯是走一遍「注册 → 登录 → 新增客户 → 建产品 → 签合同 → 生成订单 → 记收款」的完整链路,每一步都去数据库SELECT一下,确认数据真的落库了,而不是页面假装成功。这一步能揪出很多「页面提示成功但 SQL 没执行」的假象。

验证通过后,二次开发有两个方向值得试。一是把 JSP 里的数据库操作抽到 DAO 层,现在很多页面直接写 SQL,改一个字段要翻好几个文件,抽出来之后维护成本直线下降。二是给客户表加个「最后跟进时间」字段,配合定时任务把超过 30 天没跟进的客户标红,这才是 CRM 真正产生价值的地方——它不只是记录,而是提醒你该干活了。

ALTER TABLE customer ADD COLUMN last_follow_time DATETIME; -- 查询超期未跟进的客户 SELECT name, phone, last_follow_time FROM customer WHERE last_follow_time < DATE_SUB(NOW(), INTERVAL 30 DAY) OR last_follow_time IS NULL;

参数说明:DATE_SUB(NOW(), INTERVAL 30 DAY)算出 30 天前的时间点,IS NULL兜住从没跟进过的客户。这个查询可以直接做成后台首页的提醒卡片。

还有个容易忽略的点:这套系统密码是明文存的。教学演示无所谓,但只要涉及真实客户数据,登录和注册那里必须加 MD5 或 BCrypt 哈希,别等出事再补。从那以后我每次拿到这类毕设代码,第一件事就是搜password字段看是不是明文,是就先改掉再谈别的功能。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表