智慧教务系统
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

学员端消息管理数据库分析报告

📋 需求分析

基于 pages-student/messages/index.vue 页面分析,学员端消息管理需要实现:

  1. 消息列表展示:显示学员接收的所有消息
  2. 消息类型筛选:按消息类型进行分类筛选
  3. 消息搜索功能:关键词搜索消息内容(当前缺失
  4. 消息已读状态:标记消息已读/未读
  5. 消息数量统计:显示未读消息数量和总消息数
  6. 业务页面跳转:根据 message_type 跳转到对应业务页面(当前缺失

🗄️ 数据库表结构分析

1. school_chat_messages 表

现有字段分析

基于模型文件分析,该表应包含以下字段:

  • id - 主键ID
  • from_type - 发送者类型(enum: personnel, customer, system)
  • from_id - 发送者ID
  • to_id - 接收者ID
  • friend_id - 关联 chat_friends 表ID
  • message_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 - 主键ID
  • personnel_id - 员工ID
  • customer_resources_id - 客户资源ID
  • create_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;
}

📊 总结

主要问题

  1. 消息类型枚举不匹配:数据库枚举与前端期望完全不同
  2. 缺少已读状态字段:无法实现已读/未读功能
  3. 缺少搜索功能:前端没有搜索框,后端没有搜索接口
  4. 缺少业务跳转逻辑:无法根据消息类型跳转到业务页面
  5. 缺少消息统计字段:chat_friends 表无法统计消息数量

修复优先级

  1. 高优先级:修改消息类型枚举,添加已读状态字段
  2. 中优先级:添加搜索功能,完善业务跳转逻辑
  3. 低优先级:添加消息统计字段和触发器

建议

建议先修改数据库结构,然后完善前端功能,最后实现后端接口,确保学员端消息管理功能完整可用。