MessageController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2013-2019 http://www.thinkcmf.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 老猫 <thinkcmf@126.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\love\controller;
  12. use app\love\model\UserFriendModel;
  13. use app\love\model\UserInviteModel;
  14. use app\love\model\UserMessageModel;
  15. use app\love\model\UserModel;
  16. class MessageController extends LoveBaseController
  17. {
  18. /**
  19. * 好友列表
  20. */
  21. public function index()
  22. {
  23. $user_id = cmf_get_current_user_id();
  24. $list = UserFriendModel::with('friend')->where('user_id', $user_id)->select();
  25. foreach ($list as $v) {
  26. $v['last_msg_time_text'] = date('m-d H:i', $v['last_msg_time']);
  27. }
  28. $this->assign('list', $list);
  29. //未读消息数
  30. $unread_num = UserFriendModel::where('user_id', $user_id)->sum('unread_num');
  31. //收到邀请数
  32. $invite_num = UserInviteModel::where('to_id', $user_id)
  33. ->where('status', 1)
  34. ->count();
  35. $this->assign('unread_num', $unread_num + $invite_num);
  36. $this->assign('invite_num', $invite_num);
  37. return $this->fetch();
  38. }
  39. /**
  40. * 聊天页
  41. */
  42. public function detail()
  43. {
  44. //错误判断
  45. $id = $this->request->get('id');
  46. if (empty($id)) {
  47. $this->error('该用户不存在');
  48. }
  49. $my_id = cmf_get_current_user_id();
  50. if ($id == $my_id) {
  51. $this->error('不能和自己对话');
  52. }
  53. $user = UserModel::get($id);
  54. if (empty($user)) {
  55. $this->error('该用户不存在');
  56. }
  57. $this->assign('user', $user);
  58. $this->assign('to_id', $id);
  59. $this->assign('from_id', $my_id);
  60. //好友
  61. $friend = UserFriendModel::get(['user_id' => $my_id, 'friend_id' => $id]);
  62. if (empty($friend)) {
  63. $this->error('请等待对方通过聊天邀请');
  64. } else {
  65. $friend->unread_num = 0;
  66. $friend->save();
  67. }
  68. //获取消息
  69. $message = UserMessageModel::with('toUser,fromUser')
  70. ->where(function ($query) use ($id, $my_id) {
  71. $query->where(function ($query) use ($id, $my_id) {
  72. $query->where([
  73. ['from_id', '=', $id],
  74. ['to_id', '=', $my_id],
  75. ]);
  76. })->whereOr(
  77. function ($query) use ($id, $my_id) {
  78. $query->where([
  79. ['from_id', '=', $my_id],
  80. ['to_id', '=', $id],
  81. ]);
  82. });
  83. })->order('create_time desc')->limit(10)->select();
  84. $this->assign('last_message_time', $message->isEmpty() ? 0 : $message[0]['create_time']);
  85. foreach ($message as $v) {
  86. $v['create_time_text'] = date('m-d H:i', $v['create_time']);
  87. }
  88. $message = $message->reverse();
  89. $this->assign('first_message_time', $message->isEmpty() ? time() : $message[0]['create_time']);
  90. $this->assign('message', $message);
  91. //更多
  92. $count = UserMessageModel::with('toUser,fromUser')
  93. ->where([
  94. ['from_id', '=', $id],
  95. ['to_id', '=', $my_id],
  96. ])->whereOr([
  97. ['from_id', '=', $my_id],
  98. ['to_id', '=', $id],
  99. ])->count();
  100. $this->assign('has_more', $count > 10 ? 'true' : 'false');
  101. return $this->fetch();
  102. }
  103. /**
  104. * 发送消息
  105. */
  106. public function sendMessage()
  107. {
  108. $data = $this->request->post();
  109. $user_id = cmf_get_current_user_id();
  110. $time = time();
  111. //增加聊天记录
  112. UserMessageModel::create([
  113. 'from_id' => $user_id,
  114. 'to_id' => $data['to_id'],
  115. 'message' => $data['message'],
  116. 'create_time' => $time,
  117. ]);
  118. //增加最后聊天消息
  119. UserFriendModel::update(['last_msg' => '我:' . $data['message'], 'last_msg_time' => $time], ['user_id' => $user_id, 'friend_id' => $data['to_id']]);
  120. $friend = UserFriendModel::get(['user_id' => $data['to_id'], 'friend_id' => $user_id]);
  121. $friend->last_msg = '对方:' . $data['message'];
  122. $friend->last_msg_time = $time;
  123. $friend->unread_num++;
  124. $friend->save();
  125. //获取消息
  126. $message = UserMessageModel::with('toUser,fromUser')
  127. ->where(function ($query) use ($user_id, $data) {
  128. $query->where(function ($query) use ($user_id, $data) {
  129. $query->where([
  130. ['from_id', '=', $user_id],
  131. ['to_id', '=', $data['to_id']],
  132. ]);
  133. })->whereOr(
  134. function ($query) use ($user_id, $data) {
  135. $query->where([
  136. ['from_id', '=', $data['to_id']],
  137. ['to_id', '=', $user_id],
  138. ]);
  139. });
  140. })->where(
  141. function ($query) use ($data) {
  142. $query->where('create_time', '>', $data['message_time']);
  143. })
  144. ->order('create_time asc')->select();
  145. $this->result($message, 1);
  146. }
  147. /**
  148. * 获取消息
  149. */
  150. public function getMessage()
  151. {
  152. $data = $this->request->post();
  153. $user_id = cmf_get_current_user_id();
  154. //获取消息
  155. $message = UserMessageModel::with('toUser,fromUser')
  156. ->where(function ($query) use ($user_id, $data) {
  157. $query->where(function ($query) use ($user_id, $data) {
  158. $query->where([
  159. ['from_id', '=', $user_id],
  160. ['to_id', '=', $data['to_id']],
  161. ]);
  162. })->whereOr(
  163. function ($query) use ($user_id, $data) {
  164. $query->where([
  165. ['from_id', '=', $data['to_id']],
  166. ['to_id', '=', $user_id],
  167. ]);
  168. });
  169. })->where(
  170. function ($query) use ($data) {
  171. $query->where('create_time', '>', $data['message_time']);
  172. })
  173. ->order('create_time asc')->select();
  174. $this->result($message, 1);
  175. }
  176. /**
  177. * 更多记录
  178. */
  179. public function moreMessage()
  180. {
  181. $data = $this->request->post();
  182. $user_id = cmf_get_current_user_id();
  183. //获取消息
  184. $list = UserMessageModel::with('toUser,fromUser')
  185. ->where(function ($query) use ($user_id, $data) {
  186. $query->where(function ($query) use ($user_id, $data) {
  187. $query->where([
  188. ['from_id', '=', $user_id],
  189. ['to_id', '=', $data['to_id']],
  190. ]);
  191. })->whereOr(
  192. function ($query) use ($user_id, $data) {
  193. $query->where([
  194. ['from_id', '=', $data['to_id']],
  195. ['to_id', '=', $user_id],
  196. ]);
  197. });
  198. })->where(
  199. function ($query) use ($data) {
  200. $query->where('create_time', '<', $data['message_time']);
  201. })
  202. ->order('create_time desc')->limit(10)->select();
  203. foreach ($list as $v) {
  204. $v['create_time_text'] = date('m-d H:i', $v['create_time']);
  205. }
  206. $list = $list->reverse();
  207. $this->result($list, 1);
  208. }
  209. /**
  210. * 邀请
  211. */
  212. public function invite()
  213. {
  214. $list = UserInviteModel::with('from_user')
  215. ->where('to_id', '=', cmf_get_current_user_id())
  216. ->limit(10)
  217. ->order('status asc,create_time desc')
  218. ->select();
  219. foreach ($list as $v) {
  220. $v['user'] = $v['from_user'];
  221. $v['user']['age'] = empty($v['user']['birthday']) ? 0 : date('Y') - date('Y', $v['user']['birthday']);
  222. $v['create_time'] = date('m-d H:i', $v['create_time']);
  223. }
  224. $this->assign('list1', $list);
  225. $list = UserInviteModel::with('to_user')
  226. ->where('from_id', '=', cmf_get_current_user_id())
  227. ->limit(10)
  228. ->order('status asc,create_time desc')
  229. ->select();
  230. foreach ($list as $v) {
  231. $v['user'] = $v['to_user'];
  232. $v['user']['age'] = empty($v['user']['birthday']) ? 0 : date('Y') - date('Y', $v['user']['birthday']);
  233. $v['create_time'] = date('m-d H:i', $v['create_time']);
  234. }
  235. $this->assign('list2', $list);
  236. return $this->fetch();
  237. }
  238. /**
  239. * 邀请列表
  240. */
  241. public function inviteList()
  242. {
  243. $param = $this->request->post();
  244. $user_id = cmf_get_current_user_id();
  245. $where = [];
  246. $with = 'from_user';
  247. if ($param['status'] == 0) {
  248. $where[] = ['to_id', '=', $user_id];
  249. } elseif ($param['status'] == 1) {
  250. $where[] = ['from_id', '=', $user_id];
  251. $with = 'to_user';
  252. }
  253. $list = UserInviteModel::with($with)
  254. ->where($where)
  255. ->page($param['page'])
  256. ->limit(10)
  257. ->order('status asc,create_time desc')
  258. ->select();
  259. foreach ($list as $v) {
  260. if ($param['status'] == 0) {
  261. $v['user'] = $v['from_user'];
  262. } elseif ($param['status'] == 1) {
  263. $v['user'] = $v['to_user'];
  264. }
  265. $v['user']['age'] = empty($v['user']['birthday']) ? 0 : date('Y') - date('Y', $v['user']['birthday']);
  266. $v['create_time'] = date('m-d H:i', $v['create_time']);
  267. }
  268. $this->result($list, 1);
  269. }
  270. /**
  271. * 处理邀请
  272. */
  273. public function dealInvite()
  274. {
  275. $post = $this->request->post();
  276. $user_id = cmf_get_current_user_id();
  277. $info = UserInviteModel::get(['from_id' => $post['id'], 'to_id' => $user_id]);
  278. if (empty($info)) {
  279. $this->error('请刷新页面');
  280. }
  281. //更改状态
  282. $info->status = $post['status'];
  283. $info->save();
  284. //增加好友
  285. if ($post['status'] == 2) {
  286. UserFriendModel::create([
  287. 'user_id' => $post['id'],
  288. 'friend_id' => $user_id,
  289. 'last_msg_time' => time(),
  290. ]);
  291. UserFriendModel::create([
  292. 'user_id' => $user_id,
  293. 'friend_id' => $post['id'],
  294. 'last_msg_time' => time(),
  295. ]);
  296. $this->error('', url('detail') . '?id=' . $post['id']);
  297. } else {
  298. $this->success('');
  299. }
  300. }
  301. }