在Java后台开发中,客服留言记录功能是企业服务类系统的核心模块之一,主要用来存储用户提交的咨询内容,同时支持客服人员查看、处理和更新留言状态。实现这个功能需要先从数据模型设计入手,再逐步完成各层的逻辑编写。

一、留言数据模型设计
首先需要定义留言的实体类,明确留言包含的核心字段,通常包含留言ID、用户ID、留言内容、提交时间、处理状态、处理人ID、处理时间、处理备注这些属性。对应的实体类代码如下:
public class CustomerMessage {
// 留言ID
private Integer messageId;
// 提交留言的用户ID
private Integer userId;
// 留言内容
private String content;
// 留言提交时间
private Date submitTime;
// 处理状态 0-未处理 1-处理中 2-已处理
private Integer status;
// 处理人ID
private Integer handlerId;
// 处理时间
private Date handleTime;
// 处理备注
private String handleRemark;
// 省略getter和setter方法
}
对应的数据库表设计可以参考以下结构,使用MySQL作为存储数据库:
| 字段名 | 类型 | 说明 |
|---|---|---|
| message_id | int | 留言ID,主键自增 |
| user_id | int | 用户ID |
| content | varchar(500) | 留言内容 |
| submit_time | datetime | 提交时间 |
| status | tinyint | 处理状态 |
| handler_id | int | 处理人ID |
| handle_time | datetime | 处理时间 |
| handle_remark | varchar(200) | 处理备注 |
二、留言提交逻辑实现
用户提交留言时,需要接收前端传递的用户ID和留言内容,生成提交时间,默认状态为未处理,然后存入数据库。DAO层使用JDBC实现数据插入,业务层做参数校验,代码如下:
DAO层插入方法
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.Date;
public class CustomerMessageDao {
// 插入留言记录
public int insertMessage(Connection conn, CustomerMessage message) throws Exception {
String sql = "insert into customer_message(user_id, content, submit_time, status) values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, message.getUserId());
ps.setString(2, message.getContent());
// 提交时间转为数据库时间戳
ps.setTimestamp(3, new Timestamp(message.getSubmitTime().getTime()));
ps.setInt(4, 0); // 默认未处理状态
return ps.executeUpdate();
}
}
业务层提交逻辑
import java.util.Date;
public class CustomerMessageService {
private CustomerMessageDao messageDao = new CustomerMessageDao();
// 提交留言
public boolean submitMessage(Integer userId, String content) {
// 参数校验
if (userId == null || userId <= 0) {
throw new IllegalArgumentException("用户ID不合法");
}
if (content == null || content.trim().isEmpty()) {
throw new IllegalArgumentException("留言内容不能为空");
}
if (content.length() > 500) {
throw new IllegalArgumentException("留言内容不能超过500字");
}
Connection conn = null;
try {
conn = DBUtil.getConnection(); // 假设DBUtil是获取数据库连接的工具类
CustomerMessage message = new CustomerMessage();
message.setUserId(userId);
message.setContent(content.trim());
message.setSubmitTime(new Date());
int result = messageDao.insertMessage(conn, message);
return result > 0;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
DBUtil.closeConnection(conn);
}
}
}
三、留言查询与处理逻辑
客服人员需要查询所有留言,同时可以更新留言的处理状态和处理备注。查询支持按状态筛选,处理逻辑需要校验处理人权限和更新字段的合法性。
查询留言列表
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class CustomerMessageDao {
// 根据状态查询留言列表,status为null则查询所有
public List<CustomerMessage> queryMessages(Connection conn, Integer status) throws Exception {
List<CustomerMessage> list = new ArrayList<>();
String sql = "select message_id, user_id, content, submit_time, status, handler_id, handle_time, handle_remark from customer_message";
if (status != null) {
sql += " where status = ?";
}
sql += " order by submit_time desc";
PreparedStatement ps = conn.prepareStatement(sql);
if (status != null) {
ps.setInt(1, status);
}
ResultSet rs = ps.executeQuery();
while (rs.next()) {
CustomerMessage message = new CustomerMessage();
message.setMessageId(rs.getInt("message_id"));
message.setUserId(rs.getInt("user_id"));
message.setContent(rs.getString("content"));
message.setSubmitTime(rs.getTimestamp("submit_time"));
message.setStatus(rs.getInt("status"));
message.setHandlerId(rs.getInt("handler_id"));
message.setHandleTime(rs.getTimestamp("handle_time"));
message.setHandleRemark(rs.getString("handle_remark"));
list.add(message);
}
return list;
}
}
更新留言处理状态
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.Date;
public class CustomerMessageDao {
// 更新留言处理信息
public int updateMessageHandle(Connection conn, Integer messageId, Integer handlerId, Integer status, String handleRemark) throws Exception {
String sql = "update customer_message set handler_id = ?, status = ?, handle_time = ?, handle_remark = ? where message_id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, handlerId);
ps.setInt(2, status);
ps.setTimestamp(3, new Timestamp(new Date().getTime()));
ps.setString(4, handleRemark);
ps.setInt(5, messageId);
return ps.executeUpdate();
}
}
public class CustomerMessageService {
// 处理留言
public boolean handleMessage(Integer messageId, Integer handlerId, Integer status, String handleRemark) {
// 参数校验
if (messageId == null || messageId <= 0) {
throw new IllegalArgumentException("留言ID不合法");
}
if (handlerId == null || handlerId <= 0) {
throw new IllegalArgumentException("处理人ID不合法");
}
if (status == null || status < 0 || status > 2) {
throw new IllegalArgumentException("处理状态不合法");
}
if (handleRemark != null && handleRemark.length() > 200) {
throw new IllegalArgumentException("处理备注不能超过200字");
}
Connection conn = null;
try {
conn = DBUtil.getConnection();
CustomerMessageDao dao = new CustomerMessageDao();
int result = dao.updateMessageHandle(conn, messageId, handlerId, status, handleRemark);
return result > 0;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
DBUtil.closeConnection(conn);
}
}
}
四、注意事项
在实际开发中,还需要注意几个问题:一是数据库连接需要使用连接池管理,避免频繁创建连接消耗资源;二是留言内容需要做防SQL注入处理,使用预编译语句已经可以避免大部分注入风险;三是处理状态更新时需要校验留言是否存在,避免更新不存在的记录;四是如果系统并发量较高,需要考虑留言提交和处理操作的并发控制,避免数据不一致。
以上就是Java实现简易客服留言记录与处理逻辑的完整过程,开发者可以根据实际需求扩展更多功能,比如留言回复、留言分类、留言搜索等。