You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
10 KiB
10 KiB
学员端消息管理数据库分析报告
📋 需求分析
基于 pages-student/messages/index.vue 页面分析,学员端消息管理需要实现:
- 消息列表展示:显示学员接收的所有消息
- 消息类型筛选:按消息类型进行分类筛选
- 消息搜索功能:关键词搜索消息内容(当前缺失)
- 消息已读状态:标记消息已读/未读
- 消息数量统计:显示未读消息数量和总消息数
- 业务页面跳转:根据
message_type跳转到对应业务页面(当前缺失)
🗄️ 数据库表结构分析
1. school_chat_messages 表
现有字段分析
基于模型文件分析,该表应包含以下字段:
id- 主键IDfrom_type- 发送者类型(enum: personnel, customer, system)from_id- 发送者IDto_id- 接收者IDfriend_id- 关联 chat_friends 表IDmessage_type- 消息类型(enum: text, img, order, student_courses, person_course_schedule)content- 消息内容create_time- 创建时间update_time- 更新时间delete_time- 删除时间(软删除)
缺失字段
根据前端需求,需要添加以下字段:
-- 消息已读状态
ALTER TABLE `school_chat_messages` ADD COLUMN `is_read` tinyint(1) DEFAULT 0 COMMENT '是否已读 0-未读 1-已读';
ALTER TABLE `school_chat_messages` ADD COLUMN `read_time` timestamp NULL DEFAULT NULL COMMENT '已读时间';
-- 消息标题和业务关联
ALTER TABLE `school_chat_messages` ADD COLUMN `title` varchar(255) DEFAULT '' COMMENT '消息标题';
ALTER TABLE `school_chat_messages` ADD COLUMN `business_id` int(11) DEFAULT NULL COMMENT '关联业务ID';
ALTER TABLE `school_chat_messages` ADD COLUMN `business_type` varchar(50) DEFAULT '' COMMENT '业务类型';
2. school_chat_friends 表
现有字段分析
基于模型文件分析:
id- 主键IDpersonnel_id- 员工IDcustomer_resources_id- 客户资源IDcreate_time- 创建时间update_time- 更新时间delete_time- 删除时间(软删除)
缺失字段
需要添加消息数量统计字段:
-- 消息数量统计
ALTER TABLE `school_chat_friends` ADD COLUMN `total_messages` int(11) DEFAULT 0 COMMENT '总消息数';
ALTER TABLE `school_chat_friends` ADD COLUMN `unread_messages` int(11) DEFAULT 0 COMMENT '未读消息数';
ALTER TABLE `school_chat_friends` ADD COLUMN `last_message_time` timestamp NULL DEFAULT NULL COMMENT '最后消息时间';
ALTER TABLE `school_chat_friends` ADD COLUMN `last_message_content` text COMMENT '最后消息内容';
❌ 数据库设计问题分析
1. 消息类型枚举不匹配
数据库枚举值
message_type enum('text','img','order','student_courses','person_course_schedule')
- text:文本消息
- img:图片消息
- order:订单消息
- student_courses:学员课程变动消息
- person_course_schedule:课程安排消息
前端期望的类型
typeTabs: [
{ value: 'all', text: '全部', count: 0 },
{ value: 'system', text: '系统消息', count: 0 },
{ value: 'notification', text: '通知公告', count: 0 },
{ value: 'homework', text: '作业任务', count: 0 },
{ value: 'feedback', text: '反馈评价', count: 0 },
{ value: 'reminder', text: '课程提醒', count: 0 }
]
问题:数据库枚举值与前端期望的消息类型完全不匹配!
解决方案
需要重新设计 message_type 枚举值:
ALTER TABLE `school_chat_messages`
MODIFY COLUMN `message_type` enum(
'text', -- 文本消息
'img', -- 图片消息
'system', -- 系统消息
'notification', -- 通知公告
'homework', -- 作业任务
'feedback', -- 反馈评价
'reminder', -- 课程提醒
'order', -- 订单消息
'student_courses', -- 学员课程变动消息
'person_course_schedule' -- 课程安排消息
) DEFAULT 'text' COMMENT '消息类型';
2. 业务页面跳转逻辑缺失
当前问题
前端 viewMessage() 方法只是打开弹窗显示消息详情,没有根据 message_type 跳转到对应的业务页面。
需要的跳转逻辑
// 根据消息类型跳转到对应业务页面
navigateToBusinessPage(message) {
const routeMap = {
'order': `/pages-student/orders/detail?id=${message.business_id}`,
'student_courses': `/pages-student/courses/detail?id=${message.business_id}`,
'person_course_schedule': `/pages-student/schedule/detail?id=${message.business_id}`,
'homework': `/pages-student/homework/detail?id=${message.business_id}`,
'notification': `/pages-student/notifications/detail?id=${message.business_id}`,
'reminder': `/pages-student/reminders/detail?id=${message.business_id}`
};
const route = routeMap[message.message_type];
if (route) {
uni.navigateTo({ url: route });
}
}
3. 搜索功能缺失
前端缺失
当前页面没有搜索框和搜索功能实现。
需要添加的功能
<!-- 搜索框 -->
<view class="search_section">
<view class="search_box">
<input
type="text"
placeholder="搜索消息内容..."
v-model="searchKeyword"
@input="performSearch"
class="search_input"
/>
<view class="search_icon">🔍</view>
</view>
</view>
后端搜索接口
// 消息搜索功能
public function searchMessages($student_id, $keyword, $message_type = '') {
$where = [
['to_id', '=', $student_id],
['delete_time', '=', 0]
];
if (!empty($keyword)) {
$where[] = ['title|content', 'like', "%{$keyword}%"];
}
if (!empty($message_type) && $message_type !== 'all') {
$where[] = ['message_type', '=', $message_type];
}
return $this->model->where($where)
->order('create_time desc')
->paginate();
}
🔧 完整的数据库修改方案
1. 修改 school_chat_messages 表
-- 添加缺失字段
ALTER TABLE `school_chat_messages`
ADD COLUMN `is_read` tinyint(1) DEFAULT 0 COMMENT '是否已读 0-未读 1-已读',
ADD COLUMN `read_time` timestamp NULL DEFAULT NULL COMMENT '已读时间',
ADD COLUMN `title` varchar(255) DEFAULT '' COMMENT '消息标题',
ADD COLUMN `business_id` int(11) DEFAULT NULL COMMENT '关联业务ID',
ADD COLUMN `business_type` varchar(50) DEFAULT '' COMMENT '业务类型';
-- 修改消息类型枚举
ALTER TABLE `school_chat_messages`
MODIFY COLUMN `message_type` enum(
'text',
'img',
'system',
'notification',
'homework',
'feedback',
'reminder',
'order',
'student_courses',
'person_course_schedule'
) DEFAULT 'text' COMMENT '消息类型';
2. 修改 school_chat_friends 表
-- 添加消息统计字段
ALTER TABLE `school_chat_friends`
ADD COLUMN `total_messages` int(11) DEFAULT 0 COMMENT '总消息数',
ADD COLUMN `unread_messages` int(11) DEFAULT 0 COMMENT '未读消息数',
ADD COLUMN `last_message_time` timestamp NULL DEFAULT NULL COMMENT '最后消息时间',
ADD COLUMN `last_message_content` text COMMENT '最后消息内容';
3. 创建消息统计触发器
-- 创建触发器自动更新消息统计
DELIMITER $$
CREATE TRIGGER update_message_stats_after_insert
AFTER INSERT ON school_chat_messages
FOR EACH ROW
BEGIN
UPDATE school_chat_friends
SET
total_messages = total_messages + 1,
unread_messages = unread_messages + 1,
last_message_time = NEW.create_time,
last_message_content = NEW.content
WHERE id = NEW.friend_id;
END$$
CREATE TRIGGER update_message_stats_after_update
AFTER UPDATE ON school_chat_messages
FOR EACH ROW
BEGIN
IF OLD.is_read = 0 AND NEW.is_read = 1 THEN
UPDATE school_chat_friends
SET unread_messages = unread_messages - 1
WHERE id = NEW.friend_id;
END IF;
END$$
DELIMITER ;
🎯 前端功能补充建议
1. 添加搜索功能
<!-- 在消息类型筛选后添加搜索框 -->
<view class="search_section">
<view class="search_box">
<input
type="text"
placeholder="搜索消息标题或内容..."
v-model="searchKeyword"
@input="performSearch"
class="search_input"
/>
<view class="search_icon" @click="performSearch">🔍</view>
</view>
</view>
2. 添加业务页面跳转
// 修改 viewMessage 方法
viewMessage(message) {
// 如果有关联业务,直接跳转
if (message.business_id && message.business_type) {
this.navigateToBusinessPage(message);
} else {
// 否则显示消息详情弹窗
this.selectedMessage = message;
this.showMessagePopup = true;
}
// 标记为已读
if (!message.is_read) {
this.markAsRead(message);
}
}
3. 完善消息类型映射
getTypeText(type) {
const typeMap = {
'text': '文本消息',
'img': '图片消息',
'system': '系统消息',
'notification': '通知公告',
'homework': '作业任务',
'feedback': '反馈评价',
'reminder': '课程提醒',
'order': '订单消息',
'student_courses': '课程变动',
'person_course_schedule': '课程安排'
};
return typeMap[type] || type;
}
📊 总结
主要问题
- ❌ 消息类型枚举不匹配:数据库枚举与前端期望完全不同
- ❌ 缺少已读状态字段:无法实现已读/未读功能
- ❌ 缺少搜索功能:前端没有搜索框,后端没有搜索接口
- ❌ 缺少业务跳转逻辑:无法根据消息类型跳转到业务页面
- ❌ 缺少消息统计字段:chat_friends 表无法统计消息数量
修复优先级
- 高优先级:修改消息类型枚举,添加已读状态字段
- 中优先级:添加搜索功能,完善业务跳转逻辑
- 低优先级:添加消息统计字段和触发器
建议
建议先修改数据库结构,然后完善前端功能,最后实现后端接口,确保学员端消息管理功能完整可用。