304 lines
7.6 KiB
PHP
304 lines
7.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\admin\controller\Cms\Domain;
|
|
|
|
use app\admin\BaseController;
|
|
use think\facade\Db;
|
|
use think\Request;
|
|
use think\facade\Session;
|
|
use app\model\Tenant\TenantDomain;
|
|
use app\model\Tenant\Tenant;
|
|
use app\model\System\SystemDomainPool;
|
|
|
|
/**
|
|
* 租户域名绑定控制器
|
|
*/
|
|
class TenantDomainController extends BaseController
|
|
{
|
|
/**
|
|
* 获取租户域名列表(管理员查看所有)
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$page = $request->param('page', 1, 'int');
|
|
$pageSize = $request->param('pageSize', 10, 'int');
|
|
$tenantId = $request->param('tid', 0, 'int');
|
|
$status = $request->param('status', '');
|
|
$subDomain = $request->param('sub_domain', '');
|
|
|
|
$where = [['delete_time', '=', null]];
|
|
|
|
if ($tenantId > 0) {
|
|
$where[] = ['tid', '=', $tenantId];
|
|
}
|
|
if ($status !== '' && $status !== null) {
|
|
$where[] = ['status', '=', $status];
|
|
}
|
|
if ($subDomain) {
|
|
$where[] = ['sub_domain', 'like', "%$subDomain%"];
|
|
}
|
|
|
|
$list = TenantDomain::where($where)
|
|
->page($page, $pageSize)
|
|
->order('id', 'desc')
|
|
->select()
|
|
->toArray();
|
|
|
|
$total = TenantDomain::where($where)
|
|
->count();
|
|
|
|
// 获取租户名称
|
|
$tenantIds = array_column($list, 'tid');
|
|
$tenants = [];
|
|
if ($tenantIds) {
|
|
$tenantList = Tenant::whereIn('id', $tenantIds)
|
|
->select()
|
|
->toArray();
|
|
$tenants = array_column($tenantList, null, 'id');
|
|
}
|
|
|
|
// 附加租户名称
|
|
foreach ($list as &$item) {
|
|
$item['tenant_name'] = $tenants[$item['tid']]['tenant_name'] ?? '';
|
|
}
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => 'success',
|
|
'data' => [
|
|
'list' => $list,
|
|
'total' => $total
|
|
]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 获取当前租户的域名列表(租户端)
|
|
*/
|
|
public function myDomains(Request $request)
|
|
{
|
|
$tid = $request->param('tid', 0, 'int');
|
|
|
|
if ($tid <= 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '租户ID不能为空'
|
|
]);
|
|
}
|
|
|
|
$list = TenantDomain::where('tid', $tid)
|
|
->where('delete_time', null)
|
|
->order('id', 'desc')
|
|
->select()
|
|
->toArray();
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => 'success',
|
|
'data' => $list
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 租户申请二级域名
|
|
*/
|
|
public function apply(Request $request)
|
|
{
|
|
$tid = $request->param('tid', 0, 'int');
|
|
$subDomain = $request->param('sub_domain', '');
|
|
$mainDomain = $request->param('main_domain', '');
|
|
|
|
if ($tid <= 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '租户ID不能为空'
|
|
]);
|
|
}
|
|
|
|
if (empty($subDomain)) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '二级域名前缀不能为空'
|
|
]);
|
|
}
|
|
|
|
if (empty($mainDomain)) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '请选择主域名'
|
|
]);
|
|
}
|
|
|
|
// 验证域名格式(只能包含字母、数字、连字符)
|
|
if (!preg_match('/^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$/', $subDomain)) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '二级域名前缀格式不正确'
|
|
]);
|
|
}
|
|
|
|
// 检查主域名是否存在且启用
|
|
$mainDomainInfo = SystemDomainPool::where('main_domain', $mainDomain)
|
|
->where('status', 1)
|
|
->where('delete_time', null)
|
|
->find();
|
|
|
|
if (!$mainDomainInfo) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '主域名不存在或已禁用'
|
|
]);
|
|
}
|
|
|
|
// 检查二级域名是否已被使用
|
|
$exists = TenantDomain::where('sub_domain', $subDomain)
|
|
->where('main_domain', $mainDomain)
|
|
->where('delete_time', null)
|
|
->find();
|
|
|
|
if ($exists) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '该二级域名已被使用'
|
|
]);
|
|
}
|
|
|
|
$fullDomain = $subDomain . '.' . $mainDomain;
|
|
$now = date('Y-m-d H:i:s');
|
|
|
|
$id = TenantDomain::insertGetId([
|
|
'tid' => $tid,
|
|
'sub_domain' => $subDomain,
|
|
'main_domain' => $mainDomain,
|
|
'full_domain' => $fullDomain,
|
|
'status' => 0, // 审核中
|
|
'create_time' => $now,
|
|
'update_time' => $now
|
|
]);
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => '申请提交成功,等待审核',
|
|
'data' => ['id' => $id]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 审核租户域名(通过/拒绝)
|
|
*/
|
|
public function audit(Request $request)
|
|
{
|
|
$id = $request->param('id', 0, 'int');
|
|
$action = $request->param('action', ''); // 'approve' 或 'reject'
|
|
|
|
if ($id <= 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '参数错误'
|
|
]);
|
|
}
|
|
|
|
$domain = TenantDomain::where('id', $id)
|
|
->find();
|
|
|
|
if (!$domain) {
|
|
return json([
|
|
'code' => 404,
|
|
'msg' => '域名不存在'
|
|
]);
|
|
}
|
|
|
|
if ($domain['status'] != 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '该域名已审核过了'
|
|
]);
|
|
}
|
|
|
|
$newStatus = $action === 'approve' ? 1 : 2; // 1-已生效 2-已拒绝
|
|
|
|
TenantDomain::where('id', $id)
|
|
->update([
|
|
'status' => $newStatus,
|
|
'update_time' => date('Y-m-d H:i:s')
|
|
]);
|
|
|
|
$msg = $action === 'approve' ? '审核通过' : '已拒绝';
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => $msg
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 禁用/启用租户域名
|
|
*/
|
|
public function toggleStatus(Request $request)
|
|
{
|
|
$id = $request->param('id', 0, 'int');
|
|
|
|
if ($id <= 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '参数错误'
|
|
]);
|
|
}
|
|
|
|
$domain = TenantDomain::where('id', $id)
|
|
->find();
|
|
|
|
if (!$domain) {
|
|
return json([
|
|
'code' => 404,
|
|
'msg' => '域名不存在'
|
|
]);
|
|
}
|
|
|
|
// 只有已生效的域名才能被禁用
|
|
if ($domain['status'] != 1) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '只有已生效的域名才能被禁用'
|
|
]);
|
|
}
|
|
|
|
// 切换为禁用状态
|
|
TenantDomain::where('id', $id)
|
|
->update([
|
|
'status' => 2,
|
|
'update_time' => date('Y-m-d H:i:s')
|
|
]);
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => '已禁用'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 删除租户域名(软删除)
|
|
*/
|
|
public function delete($id)
|
|
{
|
|
if ($id <= 0) {
|
|
return json([
|
|
'code' => 400,
|
|
'msg' => '参数错误'
|
|
]);
|
|
}
|
|
|
|
TenantDomain::where('id', $id)
|
|
->update([
|
|
'delete_time' => date('Y-m-d H:i:s')
|
|
]);
|
|
|
|
return json([
|
|
'code' => 200,
|
|
'msg' => '删除成功'
|
|
]);
|
|
}
|
|
}
|