diff --git a/app/index/controller/UserController.php b/app/index/controller/UserController.php index 40a01c0..09603d3 100644 --- a/app/index/controller/UserController.php +++ b/app/index/controller/UserController.php @@ -9,6 +9,8 @@ use \think\facade\Log; use \think\facade\Cache; use PHPMailer\PHPMailer\PHPMailer; use think\Response; +use app\index\model\UserMessage; +use app\index\model\SystemNotice; class UserController extends BaseController { @@ -141,14 +143,22 @@ class UserController extends BaseController { try { Log::record('用户退出登录', 'info'); - + // 清除所有会话和缓存数据 session(null); Cache::tag('user_cache')->clear(); - + // 清除所有cookie - $cookies = ['user_id', 'user_account', 'user_name', 'user_avatar', - 'expire_time', 'is_auto_login', 'auto_login_attempted', 'PHPSESSID']; + $cookies = [ + 'user_id', + 'user_account', + 'user_name', + 'user_avatar', + 'expire_time', + 'is_auto_login', + 'auto_login_attempted', + 'PHPSESSID' + ]; foreach ($cookies as $cookie) { cookie($cookie, null, ['expire' => -1]); } @@ -408,4 +418,218 @@ class UserController extends BaseController } } + /** + * 获取系统通知列表 + */ + public function getNotifications() + { + // 检查用户是否登录 + if (!cookie('user_account')) { + return json(['code' => 1, 'msg' => '请先登录']); + } + + $type = $this->request->get('type', 'all'); // 获取通知类型:all, unread, read + $userId = cookie('user_id'); + + try { + // 构建查询条件 + $where = [ + ['status', '=', 1] // 只获取启用的通知 + ]; + + // 查询系统通知 + $notices = SystemNotice::where($where) + ->order('is_top', 'desc') // 置顶的排在前面 + ->order('create_time', 'desc') + ->select(); + + // 格式化数据 + $data = []; + foreach ($notices as $notice) { + // 检查用户是否已读该通知 + $isRead = SystemNotice::where([ + ['user_id', '=', $userId], + ['notice_id', '=', $notice->id], + ['is_read', '=', 1] + ])->find(); + + // 根据type过滤 + if ($type == 'unread' && $isRead) + continue; + if ($type == 'read' && !$isRead) + continue; + + $data[] = [ + 'id' => $notice->id, + 'title' => $notice->title, + 'content' => $notice->content, + 'type' => $notice->type, + 'is_top' => $notice->is_top, + 'is_read' => $isRead ? 1 : 0, + 'create_time' => date('Y-m-d H:i:s', $notice->create_time) + ]; + } + + return json(['code' => 0, 'msg' => '获取成功', 'data' => $data]); + } catch (\Exception $e) { + return json(['code' => 1, 'msg' => '获取失败:' . $e->getMessage()]); + } + } + + /** + * 查看通知详情 + */ + public function readNotification() + { + // 检查用户是否登录 + if (!cookie('user_account')) { + return json(['code' => 1, 'msg' => '请先登录']); + } + + $data = $this->request->post(); + $noticeId = $data['id'] ?? 0; + $userId = cookie('user_id'); + + try { + // 查询通知 + $notice = SystemNotice::where('id', $noticeId) + ->where('status', 1) + ->find(); + + if (!$notice) { + return json(['code' => 1, 'msg' => '通知不存在']); + } + + // 记录用户已读状态 + $message = SystemNotice::where([ + ['user_id', '=', $userId], + ['notice_id', '=', $noticeId] + ])->find(); + + if (!$message) { + // 创建新的已读记录 + $message = new SystemNotice; + $message->user_id = $userId; + $message->notice_id = $noticeId; + $message->is_read = 1; + $message->read_time = time(); + $message->save(); + } elseif (!$message->is_read) { + // 更新已读状态 + $message->is_read = 1; + $message->read_time = time(); + $message->save(); + } + + return json(['code' => 0, 'msg' => '操作成功']); + } catch (\Exception $e) { + return json(['code' => 1, 'msg' => '操作失败:' . $e->getMessage()]); + } + } + + /** + * 通知详情页面 + */ + public function notificationDetail() + { + // 检查用户是否登录 + if (!cookie('user_account')) { + return redirect('/index/user/login'); + } + + $noticeId = $this->request->get('id'); + $userId = cookie('user_id'); + + try { + // 查询通知 + $notice = SystemNotice::where('id', $noticeId) + ->where('status', 1) + ->find(); + + if (!$notice) { + return $this->error('通知不存在'); + } + + // 记录用户已读状态 + $message = SystemNotice::where([ + ['user_id', '=', $userId], + ['notice_id', '=', $noticeId] + ])->find(); + + if (!$message) { + // 创建新的已读记录 + $message = new SystemNotice; + $message->user_id = $userId; + $message->notice_id = $noticeId; + $message->is_read = 1; + $message->read_time = time(); + $message->save(); + } elseif (!$message->is_read) { + // 更新已读状态 + $message->is_read = 1; + $message->read_time = time(); + $message->save(); + } + + // 增加查看次数 + $notice->view_count = $notice->view_count + 1; + $notice->save(); + + View::assign('notice', $notice); + return $this->fetch('notification_detail'); + } catch (\Exception $e) { + return $this->error('获取通知详情失败:' . $e->getMessage()); + } + } + + //修改密码 + public function updatePassword() + { + // 检查用户是否登录 + if (!cookie('user_account')) { + return redirect('/index/user/login'); + } + + // 获取用户信息 + $user = Users::where('account', cookie('user_account'))->find(); + if (!$user) { + return redirect('/index/user/login'); + } + + // 如果是GET请求,显示修改密码页面 + if ($this->request->isGet()) { + return $this->fetch(); + } + + // 如果是POST请求,处理密码修改 + if ($this->request->isPost()) { + $data = $this->request->post(); + + // 验证旧密码 + if ($user->password !== md5($data['old_password'])) { + return json(['code' => 1, 'msg' => '旧密码错误']); + } + + // 验证新密码 + if ($data['new_password'] !== $data['confirm_password']) { + return json(['code' => 1, 'msg' => '两次输入的密码不一致']); + } + + // 更新密码 + $user->password = md5($data['new_password']); + $user->update_time = time(); + + if ($user->save()) { + // 清除登录状态 + cookie('user_id', null, ['expire' => -1]); + cookie('user_account', null, ['expire' => -1]); + cookie('user_name', null, ['expire' => -1]); + cookie('user_avatar', null, ['expire' => -1]); + + return json(['code' => 0, 'msg' => '密码修改成功,请重新登录']); + } else { + return json(['code' => 1, 'msg' => '密码修改失败']); + } + } + } } diff --git a/app/index/view/user/component/security.php b/app/index/view/user/component/security.php index b6b416c..a564c88 100644 --- a/app/index/view/user/component/security.php +++ b/app/index/view/user/component/security.php @@ -1,6 +1,6 @@