Files

149 lines
4.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
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([], '删除成功');
}
}