ChatController.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Module\Base;
  5. use App\Module\Chat;
  6. use App\Module\Users;
  7. use DB;
  8. use Request;
  9. /**
  10. * @apiDefine chat
  11. *
  12. * 聊天
  13. */
  14. class ChatController extends Controller
  15. {
  16. public function __invoke($method, $action = '')
  17. {
  18. $app = $method ? $method : 'main';
  19. if ($action) {
  20. $app .= "__" . $action;
  21. }
  22. return (method_exists($this, $app)) ? $this->$app() : Base::ajaxError("404 not found (" . str_replace("__", "/", $app) . ").");
  23. }
  24. /**
  25. * 对话列表
  26. */
  27. public function dialog__lists()
  28. {
  29. $user = Users::authE();
  30. if (Base::isError($user)) {
  31. return $user;
  32. } else {
  33. $user = $user['data'];
  34. }
  35. //
  36. $lists = Base::DBC2A(DB::table('chat_dialog')
  37. ->where(function ($query) use ($user) {
  38. return $query->where('user1', $user['username'])->where('del1', 0);
  39. })
  40. ->orWhere(function ($query) use ($user) {
  41. return $query->where('user2', $user['username'])->where('del2', 0);
  42. })
  43. ->orderByDesc('lastdate')
  44. ->take(200)
  45. ->get());
  46. if (count($lists) <= 0) {
  47. return Base::retError('暂无对话记录');
  48. }
  49. $hasUnset = false;
  50. foreach ($lists AS $key => $item) {
  51. $tmpUserInfo = Users::username2basic($item['user1'] == $user['username'] ? $item['user2'] : $item['user1']);
  52. if (empty($tmpUserInfo)) {
  53. DB::table('chat_dialog')->where('id', $item['id'])->update(['del1' => 1, 'del2' => 1]);
  54. $hasUnset = true;
  55. unset($lists[$key]);
  56. continue;
  57. }
  58. $lists[$key] = array_merge($item, $tmpUserInfo);
  59. $lists[$key]['lastdate'] = $item['lastdate'] ?: $item['indate'];
  60. $unread = 0;
  61. if ($item['user1'] == $user['username']) $unread+= $item['unread1'];
  62. if ($item['user2'] == $user['username']) $unread+= $item['unread2'];
  63. $lists[$key]['unread'] = $unread;
  64. }
  65. if ($hasUnset) {
  66. $lists = array_values($lists);
  67. }
  68. return Base::retSuccess('success', $lists);
  69. }
  70. /**
  71. * 清空聊天记录(删除对话)
  72. *
  73. * @apiParam {String} username 用户名
  74. * @apiParam {Number} [delete] 是否删除对话,1:是
  75. */
  76. public function dialog__clear()
  77. {
  78. $user = Users::authE();
  79. if (Base::isError($user)) {
  80. return $user;
  81. } else {
  82. $user = $user['data'];
  83. }
  84. //
  85. $delete = intval(Request::input('delete'));
  86. $res = Chat::openDialog($user['username'], trim(Request::input('username')));
  87. if (Base::isError($res)) {
  88. return $res;
  89. }
  90. $dialog = $res['data'];
  91. $lastMsg = Base::DBC2A(DB::table('chat_msg')
  92. ->select(['id'])
  93. ->where('did', $dialog['id'])
  94. ->orderByDesc('indate')
  95. ->orderByDesc('id')
  96. ->first());
  97. $upArray = [
  98. ($dialog['recField'] == 1 ? 'lastid2' : 'lastid1') => $lastMsg ? $lastMsg['id'] : 0
  99. ];
  100. if ($delete === 1) {
  101. $upArray[($dialog['recField'] == 1 ? 'del2' : 'del1')] = 1;
  102. }
  103. DB::table('chat_dialog')->where('id', $dialog['id'])->update($upArray);
  104. Chat::forgetDialog($dialog['user1'], $dialog['user2']);
  105. return Base::retSuccess($delete ? '删除成功!' : '清除成功!');
  106. }
  107. /**
  108. * 消息列表
  109. *
  110. * @apiParam {String} username 用户名
  111. * @apiParam {Number} [page] 当前页,默认:1
  112. * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:100
  113. */
  114. public function message__lists()
  115. {
  116. $user = Users::authE();
  117. if (Base::isError($user)) {
  118. return $user;
  119. } else {
  120. $user = $user['data'];
  121. }
  122. //
  123. $res = Chat::openDialog($user['username'], trim(Request::input('username')));
  124. if (Base::isError($res)) {
  125. return $res;
  126. }
  127. $dialog = $res['data'];
  128. $lastid = $dialog[($dialog['recField'] == 1 ? 'lastid2' : 'lastid1')];
  129. $whereArray = [];
  130. $whereArray[] = ['did', '=', $dialog['id']];
  131. if ($lastid > 0) {
  132. $whereArray[] = ['id', '>', $lastid];
  133. }
  134. $lists = DB::table('chat_msg')
  135. ->where($whereArray)
  136. ->orderByDesc('indate')
  137. ->orderByDesc('id')
  138. ->paginate(Base::getPaginate(100, 20));
  139. $lists = Base::getPageList($lists, false);
  140. //
  141. foreach ($lists['lists'] AS $key => $item) {
  142. $basic = Users::username2basic($item['username']);
  143. $item['nickname'] = $basic ? $basic['nickname'] : ($item['nickname'] || '');
  144. $item['userimg'] = $basic ? $basic['userimg'] : ($item['userimg'] || '');
  145. $item['message'] = Base::string2array($item['message']);
  146. $lists['lists'][$key] = $item;
  147. }
  148. //
  149. return Base::retSuccess('success', $lists);
  150. }
  151. /**
  152. * 文件 - 上传
  153. *
  154. * @apiParam {String} username get-发给用户名(群组名)
  155. * @apiParam {String} [filename] post-文件名称
  156. * @apiParam {String} [image64] post-base64图片(二选一)
  157. * @apiParam {File} [files] post-文件对象(二选一)
  158. */
  159. public function files__upload()
  160. {
  161. $user = Users::authE();
  162. if (Base::isError($user)) {
  163. return $user;
  164. } else {
  165. $user = $user['data'];
  166. }
  167. //
  168. $username = trim(Request::input('username'));
  169. if (Base::leftExists($username, "group::")) {
  170. //$res = Chat::groupOpen($username);
  171. return Base::retError('参数错误');
  172. } else {
  173. $res = Chat::openDialog($user['username'], $username);
  174. }
  175. if (Base::isError($res)) {
  176. return $res;
  177. }
  178. $did = $res['data']['id'];
  179. //
  180. $path = "uploads/chat/" . Users::token2userid() . "/";
  181. $image64 = trim(Base::getPostValue('image64'));
  182. $fileName = trim(Base::getPostValue('filename'));
  183. if ($image64) {
  184. $data = Base::image64save([
  185. "image64" => $image64,
  186. "path" => $path,
  187. "fileName" => $fileName,
  188. ]);
  189. } else {
  190. $data = Base::upload([
  191. "file" => Request::file('files'),
  192. "type" => 'file',
  193. "path" => $path,
  194. "fileName" => $fileName,
  195. ]);
  196. }
  197. //
  198. if (Base::isError($data)) {
  199. return Base::retError($data['msg']);
  200. } else {
  201. $fileData = $data['data'];
  202. $fileData['thumb'] = $fileData['thumb'] ?: 'images/files/file.png';
  203. switch ($fileData['ext']) {
  204. case "docx":
  205. $fileData['thumb'] = 'images/files/doc.png';
  206. break;
  207. case "xlsx":
  208. $fileData['thumb'] = 'images/files/xls.png';
  209. break;
  210. case "pptx":
  211. $fileData['thumb'] = 'images/files/ppt.png';
  212. break;
  213. case "ai":
  214. case "avi":
  215. case "bmp":
  216. case "cdr":
  217. case "doc":
  218. case "eps":
  219. case "gif":
  220. case "mov":
  221. case "mp3":
  222. case "mp4":
  223. case "pdf":
  224. case "ppt":
  225. case "pr":
  226. case "psd":
  227. case "rar":
  228. case "svg":
  229. case "tif":
  230. case "txt":
  231. case "xls":
  232. case "zip":
  233. $fileData['thumb'] = 'images/files/' . $fileData['ext'] . '.png';
  234. break;
  235. }
  236. $array = [
  237. 'did' => $did,
  238. 'group' => Base::leftExists($username, 'group::') ? $username : '',
  239. 'name' => $fileData['name'],
  240. 'size' => $fileData['size'] * 1024,
  241. 'ext' => $fileData['ext'],
  242. 'path' => $fileData['path'],
  243. 'thumb' => $fileData['thumb'],
  244. 'username' => $user['username'],
  245. 'indate' => Base::time(),
  246. ];
  247. DB::table('chat_files')->insertGetId($array);
  248. //
  249. $fileData['thumb'] = Base::fillUrl($fileData['thumb']);
  250. return Base::retSuccess('success', $fileData);
  251. }
  252. }
  253. }