// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\wxchat\controller\backend; use addon\wxchat\model\WxchatRoom as WxchatRoomModel; use addon\wxchat\model\WxchatRoomMember; use addon\wxchat\model\WxchatRoomMic; use think\facade\Db; use think\facade\View; use ywxapp\controller\BackendBase; /** * 语音 / 视频房 - 后台管理(列表 / 详情 / 编辑 / 关闭 / 删除) */ class WxchatRoom extends BackendBase { // 插件后台按框架惯例放宽登录校验(与 mqttbroker 等插件后台一致) protected $noNeedVerify = ['*']; protected function initialize() {} public function index() { if ($this->request->isAjax()) { return $this->lists(); } return View::fetch('wxchatroom/index'); } /** * 房间列表(关联房主昵称 + 实时成员数) */ public function lists() { $page = (int) $this->request->param('page', 1); $limit = (int) $this->request->param('limit', 15); $kw = trim((string) $this->request->param('keyword', '')); $type = (int) $this->request->param('type', 0); $query = WxchatRoomModel::alias('r') ->join('user u', 'u.uid = r.owner_uid', 'left') ->field('r.*, u.nickname AS owner_name'); if ($kw !== '') { $query->where('r.title', 'like', "%{$kw}%"); } if ($type) { $query->where('r.type', $type); } $total = $query->count(); $rows = $query->order('r.hot', 'desc') ->order('r.create_at', 'desc') ->page($page, $limit)->select(); foreach ($rows as $r) { $r->member_count = (int) WxchatRoomMember::where('room_id', $r->id)->count(); } $this->result->setCount($total)->success($rows->toArray()); } /** * 房间详情 + 成员列表 */ public function detail() { $id = (int) $this->request->param('id', 0); $room = WxchatRoomModel::find($id); if (! $room) { $this->result->error('房间不存在'); } $members = WxchatRoomMember::alias('m') ->join('user u', 'u.uid = m.uid', 'left') ->where('m.room_id', $id) ->field('m.uid, m.role, m.join_at, u.nickname, u.avatar') ->select(); $mics = WxchatRoomMic::where('room_id', $id)->order('mic_index')->select(); $this->result->success([ 'room' => $room->toArray(), 'members' => $members->toArray(), 'mics' => $mics->toArray(), ]); } /** * 编辑(标题 / 公告 / 开关房) */ public function save() { $id = (int) $this->request->post('id', 0); $data = $this->request->only(['title', 'notice', 'status', 'danmaku_on'], 'post'); $room = WxchatRoomModel::find($id); if (! $room) { $this->result->error('房间不存在'); } if (isset($data['status'])) { $data['status'] = (int) $data['status']; } if (isset($data['danmaku_on'])) { $data['danmaku_on'] = (int) $data['danmaku_on']; } $room->save($data); $this->result->success([], '保存成功'); } /** * 关闭房间(置 status=0) */ public function close() { $id = (int) $this->request->post('id', 0); $room = WxchatRoomModel::find($id); if (! $room) { $this->result->error('房间不存在'); } $room->status = 0; $room->save(); $this->result->success([], '已关闭房间'); } /** * 删除房间(级联清理成员与麦位) */ public function del($ids = '') { $ids = $this->request->param('ids', ''); if (! $ids) { $this->result->error('请选择要删除的数据'); } $idArr = array_filter(array_map('intval', explode(',', $ids))); Db::transaction(function () use ($idArr) { WxchatRoomMember::whereIn('room_id', $idArr)->delete(); WxchatRoomMic::whereIn('room_id', $idArr)->delete(); WxchatRoomModel::destroy($idArr); }); $this->result->success([], '删除成功'); } }