|
@@ -0,0 +1,704 @@
|
|
|
|
+<?php
|
|
|
|
+require_once 'conn.php';
|
|
|
|
+checkLogin();
|
|
|
|
+
|
|
|
|
+// 获取当前登录员工ID
|
|
|
|
+$employee_id = $_SESSION['employee_id'];
|
|
|
|
+
|
|
|
|
+// 筛选参数
|
|
|
|
+$message_type = isset($_GET['message_type']) ? intval($_GET['message_type']) : 0;
|
|
|
|
+$is_read = isset($_GET['is_read']) ? intval($_GET['is_read']) : -1;
|
|
|
|
+$priority = isset($_GET['priority']) ? intval($_GET['priority']) : -1;
|
|
|
|
+$urlStr = '';
|
|
|
|
+
|
|
|
|
+// 搜索参数
|
|
|
|
+$keys = $_GET['Keys'] ?? '';
|
|
|
|
+$keyscode = mysqli_real_escape_string($conn, $keys);
|
|
|
|
+
|
|
|
|
+// 页码参数
|
|
|
|
+$page = $_GET['Page'] ?? 1;
|
|
|
|
+$ord = $_GET['Ord'] ?? '';
|
|
|
|
+
|
|
|
|
+$ordStr = !empty($ord) ? "$ord," : "";
|
|
|
|
+
|
|
|
|
+// 构建SQL查询
|
|
|
|
+$sql = "SELECT m.*, mr.is_read, mr.read_time
|
|
|
|
+ FROM messages m
|
|
|
|
+ LEFT JOIN message_recipients mr ON m.id = mr.message_id AND mr.employee_id = $employee_id
|
|
|
|
+ WHERE (m.target_type = 2 OR (mr.employee_id = $employee_id)) AND (mr.is_deleted = 0 OR mr.is_deleted IS NULL)";
|
|
|
|
+
|
|
|
|
+// 添加筛选条件
|
|
|
|
+if ($message_type > 0) {
|
|
|
|
+ $sql .= " AND m.message_type = $message_type";
|
|
|
|
+ $urlStr .= "&message_type=" . urlencode($message_type);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+if ($is_read >= 0) {
|
|
|
|
+ $sql .= " AND mr.is_read = $is_read";
|
|
|
|
+ $urlStr .= "&is_read=" . urlencode($is_read);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+if ($priority >= 0) {
|
|
|
|
+ $sql .= " AND m.priority = $priority";
|
|
|
|
+ $urlStr .= "&priority=" . urlencode($priority);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 关键词搜索
|
|
|
|
+if (!empty($keyscode)) {
|
|
|
|
+ $sql .= " AND (m.title LIKE '%$keyscode%' OR m.content LIKE '%$keyscode%')";
|
|
|
|
+ $urlStr .= "&Keys=" . urlencode($keys);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 排序 - 未读优先,然后按时间倒序
|
|
|
|
+$sql .= " ORDER BY CASE WHEN mr.is_read = 0 OR mr.is_read IS NULL THEN 0 ELSE 1 END, m.created_at DESC";
|
|
|
|
+
|
|
|
|
+?>
|
|
|
|
+
|
|
|
|
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
+<html xmlns="http://www.w3.org/1999/xhtml">
|
|
|
|
+<head>
|
|
|
|
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
|
|
+ <title>消息列表</title>
|
|
|
|
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
|
|
|
|
+ <link rel="stylesheet" href="css/alert.css" type="text/css" />
|
|
|
|
+ <script src="js/jquery-1.7.2.min.js"></script>
|
|
|
|
+ <script src="js/js.js"></script>
|
|
|
|
+ <style>
|
|
|
|
+ body {
|
|
|
|
+ margin: 0;
|
|
|
|
+ padding: 20px;
|
|
|
|
+ background: #fff;
|
|
|
|
+ }
|
|
|
|
+ #man_zone {
|
|
|
|
+ margin-left: 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 表格布局修复 */
|
|
|
|
+ .table2 {
|
|
|
|
+ width: 100%;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .theader, .tline {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: row;
|
|
|
|
+ align-items: center;
|
|
|
|
+ width: 100%;
|
|
|
|
+ border-bottom: 1px solid #ddd;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .theader {
|
|
|
|
+ background-color: #f2f2f2;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ height: 40px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .tline {
|
|
|
|
+ height: 45px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .tline:hover {
|
|
|
|
+ background-color: #f5f5f5;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .col2 { width: 5%; text-align: center; }
|
|
|
|
+ .col3 { width: 40%; }
|
|
|
|
+ .col4 { width: 10%; }
|
|
|
|
+ .col5 { width: 10%; }
|
|
|
|
+ .col6 { width: 15%; }
|
|
|
|
+ .col7 { width: 20%; }
|
|
|
|
+
|
|
|
|
+ .theader > div, .tline > div {
|
|
|
|
+ padding: 0 5px;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
+ white-space: nowrap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 消息状态标签 */
|
|
|
|
+ .badge {
|
|
|
|
+ display: inline-block;
|
|
|
|
+ padding: 3px 6px;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ color: white;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ height: 22px;
|
|
|
|
+ line-height: 16px;
|
|
|
|
+ vertical-align: middle;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .badge-primary {
|
|
|
|
+ background-color: #4285f4;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .badge-secondary {
|
|
|
|
+ background-color: #888;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .badge-warning {
|
|
|
|
+ background-color: #f4b400;
|
|
|
|
+ color: #333;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .badge-danger {
|
|
|
|
+ background-color: #db4437;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 按钮样式 */
|
|
|
|
+ .btn {
|
|
|
|
+ display: inline-block;
|
|
|
|
+ padding: 3px 8px;
|
|
|
|
+ margin: 0 2px;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ text-decoration: none;
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ height: 32px;
|
|
|
|
+ line-height: 26px;
|
|
|
|
+ vertical-align: middle;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .btn-info {
|
|
|
|
+ background-color: #4285f4;
|
|
|
|
+ color: white;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .btn-success {
|
|
|
|
+ background-color: #0f9d58;
|
|
|
|
+ color: white;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .btn-danger {
|
|
|
|
+ background-color: #db4437;
|
|
|
|
+ color: white;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .btn:hover {
|
|
|
|
+ /* opacity: 0.8; */
|
|
|
|
+ color: #fff;
|
|
|
|
+ /* background-color: #999; */
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 未读消息样式 */
|
|
|
|
+ .unread {
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 优先级颜色 */
|
|
|
|
+ .priority-1 {
|
|
|
|
+ color: #f4b400;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .priority-2 {
|
|
|
|
+ color: #db4437;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 筛选控件样式 */
|
|
|
|
+ .filter-select {
|
|
|
|
+ padding: 3px;
|
|
|
|
+ border: 1px solid #ccc;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ margin: 3px 5px 3px 0;
|
|
|
|
+ width: 100px;
|
|
|
|
+ height: 32px;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ vertical-align: middle;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 筛选条件区域样式 */
|
|
|
|
+ .filter-row {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: nowrap;
|
|
|
|
+ align-items: center;
|
|
|
|
+ margin-bottom: 8px;
|
|
|
|
+ overflow-x: auto;
|
|
|
|
+ padding-bottom: 5px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .filter-item {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ margin-right: 10px;
|
|
|
|
+ white-space: nowrap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .filter-item label {
|
|
|
|
+ margin-right: 5px;
|
|
|
|
+ white-space: nowrap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 搜索框样式 */
|
|
|
|
+ .search-input {
|
|
|
|
+ padding: 3px 8px;
|
|
|
|
+ border: 1px solid #ccc;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ width: 120px;
|
|
|
|
+ margin-right: 5px;
|
|
|
|
+ height: 32px;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ vertical-align: middle;
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .search-btn {
|
|
|
|
+ padding: 3px 10px;
|
|
|
|
+ background-color: #4285f4;
|
|
|
|
+ color: white;
|
|
|
|
+ border: none;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ height: 32px;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ vertical-align: middle;
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ line-height: 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .search-btn:hover {
|
|
|
|
+ background-color: #999;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 使按钮容器垂直居中 */
|
|
|
|
+ .col7 {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: flex-start;
|
|
|
|
+ width: 20%;
|
|
|
|
+ text-align: left;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 状态标签容器垂直居中 */
|
|
|
|
+ .col2 {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ width: 5%;
|
|
|
|
+ text-align: center;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 滑动面板样式 */
|
|
|
|
+ .msg-slidepanel {
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .msg-slidepanel.open {
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ color: #3366cc;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel {
|
|
|
|
+ display: none;
|
|
|
|
+ background: #f9f9f9;
|
|
|
|
+ padding: 10px;
|
|
|
|
+ border: 1px solid #eee;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ text-align: left;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel .noteItem {
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ margin-bottom: 5px;
|
|
|
|
+ text-align: left;
|
|
|
|
+ padding-top:0px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel .noteContent {
|
|
|
|
+ margin: 10px 0;
|
|
|
|
+ line-height: 1.5;
|
|
|
|
+ white-space: pre-line;
|
|
|
|
+ text-align: left;
|
|
|
|
+ padding-top:0px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel .noteInfo {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ gap: 15px;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ text-align: left;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel .message-header-row {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .notepanel .message-header-row .noteItem {
|
|
|
|
+ margin-right: 15px;
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
+ min-width: 80px;
|
|
|
|
+ }
|
|
|
|
+ </style>
|
|
|
|
+</head>
|
|
|
|
+<body>
|
|
|
|
+<div id="man_zone">
|
|
|
|
+ <div class="fastSelect clear">
|
|
|
|
+ <H1>筛选条件</H1>
|
|
|
|
+ <div class="filter-row">
|
|
|
|
+ <div class="filter-item">
|
|
|
|
+ <label>消息类型:</label>
|
|
|
|
+ <select name="message_type" class="filter-select filterSearch">
|
|
|
|
+ <option value="0" <?= $message_type == 0 ? 'selected' : '' ?>>所有类型</option>
|
|
|
|
+ <option value="1" <?= $message_type == 1 ? 'selected' : '' ?>>系统消息</option>
|
|
|
|
+ <option value="2" <?= $message_type == 2 ? 'selected' : '' ?>>客户相关</option>
|
|
|
|
+ <option value="3" <?= $message_type == 3 ? 'selected' : '' ?>>订单相关</option>
|
|
|
|
+ <option value="4" <?= $message_type == 4 ? 'selected' : '' ?>>任务提醒</option>
|
|
|
|
+ <option value="5" <?= $message_type == 5 ? 'selected' : '' ?>>其他</option>
|
|
|
|
+ </select>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="filter-item">
|
|
|
|
+ <label>状态:</label>
|
|
|
|
+ <select name="is_read" class="filter-select filterSearch">
|
|
|
|
+ <option value="-1" <?= $is_read == -1 ? 'selected' : '' ?>>全部状态</option>
|
|
|
|
+ <option value="0" <?= $is_read == 0 ? 'selected' : '' ?>>未读</option>
|
|
|
|
+ <option value="1" <?= $is_read == 1 ? 'selected' : '' ?>>已读</option>
|
|
|
|
+ </select>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="filter-item">
|
|
|
|
+ <label>优先级:</label>
|
|
|
|
+ <select name="priority" class="filter-select filterSearch">
|
|
|
|
+ <option value="-1" <?= $priority == -1 ? 'selected' : '' ?>>所有优先级</option>
|
|
|
|
+ <option value="0" <?= $priority == 0 ? 'selected' : '' ?>>普通</option>
|
|
|
|
+ <option value="1" <?= $priority == 1 ? 'selected' : '' ?>>重要</option>
|
|
|
|
+ <option value="2" <?= $priority == 2 ? 'selected' : '' ?>>紧急</option>
|
|
|
|
+ </select>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="filter-item">
|
|
|
|
+ <label>搜索:</label>
|
|
|
|
+ <input type="text" id="keys" class="search-input" placeholder="标题或内容" value="<?= htmlspecialcharsFix($keys) ?>" />
|
|
|
|
+ <input type="button" class="search-btn" value="搜索" onClick="doSearch()" />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="table2 em<?= $_SESSION['employee_id'] ?>">
|
|
|
|
+ <div class="theader">
|
|
|
|
+ <div class="col2">状态</div>
|
|
|
|
+ <div class="col3">标题</div>
|
|
|
|
+ <div class="col4">类型</div>
|
|
|
|
+ <div class="col5">优先级</div>
|
|
|
|
+ <div class="col6">时间</div>
|
|
|
|
+ <div class="col7">操作</div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <?php
|
|
|
|
+ // 设置每页显示记录数
|
|
|
|
+ $pageSize = 20;
|
|
|
|
+
|
|
|
|
+ // 获取总记录数
|
|
|
|
+ $countSql = "SELECT COUNT(*) AS total
|
|
|
|
+ FROM messages m
|
|
|
|
+ LEFT JOIN message_recipients mr ON m.id = mr.message_id AND mr.employee_id = $employee_id
|
|
|
|
+ WHERE (m.target_type = 2 OR (mr.employee_id = $employee_id)) AND (mr.is_deleted = 0 OR mr.is_deleted IS NULL)";
|
|
|
|
+
|
|
|
|
+ // 添加筛选条件
|
|
|
|
+ if ($message_type > 0) {
|
|
|
|
+ $countSql .= " AND m.message_type = $message_type";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($is_read >= 0) {
|
|
|
|
+ $countSql .= " AND mr.is_read = $is_read";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($priority >= 0) {
|
|
|
|
+ $countSql .= " AND m.priority = $priority";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 添加关键词搜索条件
|
|
|
|
+ if (!empty($keyscode)) {
|
|
|
|
+ $countSql .= " AND (m.title LIKE '%$keyscode%' OR m.content LIKE '%$keyscode%')";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $countResult = mysqli_query($conn, $countSql);
|
|
|
|
+ $countRow = mysqli_fetch_assoc($countResult);
|
|
|
|
+ $totalRecords = $countRow['total'];
|
|
|
|
+
|
|
|
|
+ // 计算总页数
|
|
|
|
+ $totalPages = ceil($totalRecords / $pageSize);
|
|
|
|
+ if ($totalPages < 1) $totalPages = 1;
|
|
|
|
+
|
|
|
|
+ // 验证当前页码
|
|
|
|
+ $page = (int)$page;
|
|
|
|
+ if ($page < 1) $page = 1;
|
|
|
|
+ if ($page > $totalPages) $page = $totalPages;
|
|
|
|
+
|
|
|
|
+ // 计算起始记录
|
|
|
|
+ $offset = ($page - 1) * $pageSize;
|
|
|
|
+
|
|
|
|
+ // 添加分页条件
|
|
|
|
+ $sql .= " LIMIT $offset, $pageSize";
|
|
|
|
+
|
|
|
|
+ $result = mysqli_query($conn, $sql);
|
|
|
|
+
|
|
|
|
+ if (mysqli_num_rows($result) > 0) {
|
|
|
|
+ $tempNum = ($page - 1) * $pageSize;
|
|
|
|
+ while ($row = mysqli_fetch_assoc($result)) {
|
|
|
|
+ $tempNum++;
|
|
|
|
+
|
|
|
|
+ // 确定消息状态
|
|
|
|
+ $is_read_status = $row['is_read'] ?? 0;
|
|
|
|
+
|
|
|
|
+ // 确定消息类型
|
|
|
|
+ $message_type_text = [
|
|
|
|
+ 1 => '系统消息',
|
|
|
|
+ 2 => '客户相关',
|
|
|
|
+ 3 => '订单相关',
|
|
|
|
+ 4 => '任务提醒',
|
|
|
|
+ 5 => '其他'
|
|
|
|
+ ][$row['message_type']] ?? '未知';
|
|
|
|
+
|
|
|
|
+ // 确定优先级
|
|
|
|
+ $priority_class = [
|
|
|
|
+ 0 => '',
|
|
|
|
+ 1 => 'priority-1',
|
|
|
|
+ 2 => 'priority-2'
|
|
|
|
+ ][$row['priority']] ?? '';
|
|
|
|
+
|
|
|
|
+ $priority_text = [
|
|
|
|
+ 0 => '普通',
|
|
|
|
+ 1 => '重要',
|
|
|
|
+ 2 => '紧急'
|
|
|
|
+ ][$row['priority']] ?? '未知';
|
|
|
|
+
|
|
|
|
+ // 行样式类,未读消息加粗显示
|
|
|
|
+ $row_class = $is_read_status ? '' : 'unread';
|
|
|
|
+ ?>
|
|
|
|
+ <div class="tline <?= $row_class ?>">
|
|
|
|
+ <div class="col2">
|
|
|
|
+ <?php if ($is_read_status): ?>
|
|
|
|
+ <span class="badge badge-secondary">已读</span>
|
|
|
|
+ <?php else: ?>
|
|
|
|
+ <span class="badge badge-primary">未读</span>
|
|
|
|
+ <?php endif; ?>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="col3 msg-slidepanel"><?= htmlspecialcharsFix($row['title']) ?></div>
|
|
|
|
+ <div class="col4"><?= $message_type_text ?></div>
|
|
|
|
+ <div class="col5 <?= $priority_class ?>"><?= $priority_text ?></div>
|
|
|
|
+ <div class="col6"><?= date('Y-m-d H:i', strtotime($row['created_at'])) ?></div>
|
|
|
|
+ <div class="col7">
|
|
|
|
+ <a href="message_detail.php?id=<?= $row['id'] ?>" class="btn btn-info">查看</a>
|
|
|
|
+ <?php if (!$is_read_status): ?>
|
|
|
|
+ <a href="javascript:void(0)" class="btn btn-success mark-read" data-id="<?= $row['id'] ?>">标记已读</a>
|
|
|
|
+ <?php endif; ?>
|
|
|
|
+ <a href="javascript:void(0)" class="btn btn-danger delete-message" data-id="<?= $row['id'] ?>">删除</a>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="notepanel clear">
|
|
|
|
+
|
|
|
|
+ <div class="noteItem" style="padding-top:0px;">详情</div>
|
|
|
|
+ <div class="noteInfo">
|
|
|
|
+ <div><strong>类型:</strong> <?= $message_type_text ?></div>
|
|
|
|
+ <div><strong>优先级:</strong> <span class="<?= $priority_class ?>"><?= $priority_text ?></span></div>
|
|
|
|
+ <div><strong>时间:</strong> <?= date('Y-m-d H:i:s', strtotime($row['created_at'])) ?></div>
|
|
|
|
+ <?php if ($row['read_time']): ?>
|
|
|
|
+ <div><strong>阅读时间:</strong> <?= date('Y-m-d H:i:s', strtotime($row['read_time'])) ?></div>
|
|
|
|
+ <?php endif; ?>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="noteItem" style="padding-top:0px;">内容</div>
|
|
|
|
+ <div class="noteContent"><?= nl2br(htmlspecialcharsFix($row['content'])) ?></div>
|
|
|
|
+ </div>
|
|
|
|
+ <?php
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (empty($keys) && $message_type == 0 && $is_read == -1 && $priority == -1) {
|
|
|
|
+ echo '<div class="tline"><div align="center" colspan="6">当前暂无消息记录</div></div>';
|
|
|
|
+ } else {
|
|
|
|
+ echo '<div class="tline"><div align="center" colspan="6"><a href="?">没有找到匹配的消息记录,点击返回</a></div></div>';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ ?>
|
|
|
|
+
|
|
|
|
+ <div class="showpagebox">
|
|
|
|
+ <?php
|
|
|
|
+ if ($totalPages > 1) {
|
|
|
|
+ $pageName = "?$urlStr&";
|
|
|
|
+ if ($pageName == "?&") {
|
|
|
|
+ $pageName = "?";
|
|
|
|
+ }
|
|
|
|
+ $pageLen = 3;
|
|
|
|
+
|
|
|
|
+ if ($page > 1) {
|
|
|
|
+ echo "<a href=\"{$pageName}Page=1\">首页</a>";
|
|
|
|
+ echo "<a href=\"{$pageName}Page=" . ($page - 1) . "\">上一页</a>";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($pageLen * 2 + 1 >= $totalPages) {
|
|
|
|
+ $startPage = 1;
|
|
|
|
+ $endPage = $totalPages;
|
|
|
|
+ } else {
|
|
|
|
+ if ($page <= $pageLen + 1) {
|
|
|
|
+ $startPage = 1;
|
|
|
|
+ $endPage = $pageLen * 2 + 1;
|
|
|
|
+ } else {
|
|
|
|
+ $startPage = $page - $pageLen;
|
|
|
|
+ $endPage = $page + $pageLen;
|
|
|
|
+ }
|
|
|
|
+ if ($page + $pageLen > $totalPages) {
|
|
|
|
+ $startPage = $totalPages - $pageLen * 2;
|
|
|
|
+ $endPage = $totalPages;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for ($i = $startPage; $i <= $endPage; $i++) {
|
|
|
|
+ if ($i == $page) {
|
|
|
|
+ echo "<a class=\"current\">$i</a>";
|
|
|
|
+ } else {
|
|
|
|
+ echo "<a href=\"{$pageName}Page=$i\">$i</a>";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ($page < $totalPages) {
|
|
|
|
+ if ($totalPages - $page > $pageLen) {
|
|
|
|
+ echo "<a href=\"{$pageName}Page=$totalPages\">...$totalPages</a>";
|
|
|
|
+ }
|
|
|
|
+ echo "<a href=\"{$pageName}Page=" . ($page + 1) . "\">下一页</a>";
|
|
|
|
+ echo "<a href=\"{$pageName}Page=$totalPages\">尾页</a>";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ ?>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <script>
|
|
|
|
+ $(document).ready(function() {
|
|
|
|
+ // 处理筛选条件改变
|
|
|
|
+ $('.filterSearch').change(function() {
|
|
|
|
+ var url = buildSearchUrl();
|
|
|
|
+ location.href = url;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 标记为已读
|
|
|
|
+ $('.mark-read').click(function() {
|
|
|
|
+ var messageId = $(this).data('id');
|
|
|
|
+ $.post('message_action.php', {
|
|
|
|
+ action: 'mark_read',
|
|
|
|
+ message_id: messageId
|
|
|
|
+ }, function(response) {
|
|
|
|
+ try {
|
|
|
|
+ var data = typeof response === 'string' ? JSON.parse(response) : response;
|
|
|
|
+ if (data.success) {
|
|
|
|
+ location.reload();
|
|
|
|
+ } else {
|
|
|
|
+ alert('操作失败:' + data.message);
|
|
|
|
+ }
|
|
|
|
+ } catch (e) {
|
|
|
|
+ alert('操作失败:服务器返回未知错误');
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 删除消息
|
|
|
|
+ $('.delete-message').click(function() {
|
|
|
|
+ if (confirm('确定要删除这条消息吗?')) {
|
|
|
|
+ var messageId = $(this).data('id');
|
|
|
|
+ $.post('message_action.php', {
|
|
|
|
+ action: 'delete',
|
|
|
|
+ message_id: messageId
|
|
|
|
+ }, function(response) {
|
|
|
|
+ try {
|
|
|
|
+ var data = typeof response === 'string' ? JSON.parse(response) : response;
|
|
|
|
+ if (data.success) {
|
|
|
|
+ location.reload();
|
|
|
|
+ } else {
|
|
|
|
+ alert('操作失败:' + data.message);
|
|
|
|
+ }
|
|
|
|
+ } catch (e) {
|
|
|
|
+ alert('操作失败:服务器返回未知错误');
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 点击标题展开消息内容
|
|
|
|
+ $('.msg-slidepanel').click(function() {
|
|
|
|
+ var $this = $(this);
|
|
|
|
+ var $panel = $this.closest('.tline').next('.notepanel');
|
|
|
|
+
|
|
|
|
+ // 判断是否已经打开
|
|
|
|
+ if ($panel.is(':visible')) {
|
|
|
|
+ $panel.slideUp('fast');
|
|
|
|
+ $this.removeClass('open');
|
|
|
|
+ } else {
|
|
|
|
+ // 先关闭其他已打开的面板
|
|
|
|
+ $('.notepanel').slideUp('fast');
|
|
|
|
+ $('.msg-slidepanel').removeClass('open');
|
|
|
|
+
|
|
|
|
+ // 打开当前点击的面板
|
|
|
|
+ $panel.slideDown('fast');
|
|
|
|
+ $this.addClass('open');
|
|
|
|
+
|
|
|
|
+ // 如果消息未读,自动标记为已读
|
|
|
|
+ var $row = $this.closest('.tline');
|
|
|
|
+ if ($row.hasClass('unread')) {
|
|
|
|
+ var messageId = $row.find('.mark-read').data('id');
|
|
|
|
+ if (messageId) {
|
|
|
|
+ $.post('message_action.php', {
|
|
|
|
+ action: 'mark_read',
|
|
|
|
+ message_id: messageId
|
|
|
|
+ }, function(response) {
|
|
|
|
+ try {
|
|
|
|
+ var data = typeof response === 'string' ? JSON.parse(response) : response;
|
|
|
|
+ if (data.success) {
|
|
|
|
+ // 只更新样式,不刷新页面
|
|
|
|
+ $row.removeClass('unread');
|
|
|
|
+ $row.find('.badge-primary').removeClass('badge-primary').addClass('badge-secondary').text('已读');
|
|
|
|
+ $row.find('.mark-read').remove();
|
|
|
|
+ }
|
|
|
|
+ } catch (e) {
|
|
|
|
+ // 忽略错误,不影响用户体验
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 回车键触发搜索
|
|
|
|
+ $('#keys').keypress(function(e) {
|
|
|
|
+ if (e.which == 13) {
|
|
|
|
+ doSearch();
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 执行搜索
|
|
|
|
+ function doSearch() {
|
|
|
|
+ var url = buildSearchUrl();
|
|
|
|
+ location.href = url;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 构建搜索URL
|
|
|
|
+ function buildSearchUrl() {
|
|
|
|
+ var url = '?';
|
|
|
|
+ var keys = $.trim($('#keys').val());
|
|
|
|
+ if (keys) {
|
|
|
|
+ url += 'Keys=' + encodeURIComponent(keys) + '&';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $('.filterSearch').each(function() {
|
|
|
|
+ var name = $(this).attr('name');
|
|
|
|
+ var value = $(this).val();
|
|
|
|
+ if (value && value != -1) {
|
|
|
|
+ url += name + '=' + encodeURIComponent(value) + '&';
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ // 移除末尾的&
|
|
|
|
+ if (url.endsWith('&')) {
|
|
|
|
+ url = url.substring(0, url.length - 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return url;
|
|
|
|
+ }
|
|
|
|
+ </script>
|
|
|
|
+</div>
|
|
|
|
+</body>
|
|
|
|
+</html>
|