diff --git a/app/controller/Domain.php b/app/controller/Domain.php index d2b0a0b5..71ce60c4 100644 --- a/app/controller/Domain.php +++ b/app/controller/Domain.php @@ -569,6 +569,11 @@ public function record_add() return json(['code' => -1, 'msg' => '参数不能为空']); } + $reservedCheck = $this->checkReservedRecord($name); + if ($reservedCheck['is_reserved']) { + return json(['code' => -1, 'msg' => $reservedCheck['msg']]); + } + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $recordid = $dns->addDomainRecord($name, $type, $value, $line, $ttl, $mx, $weight, $remark); if ($recordid) { @@ -604,6 +609,11 @@ public function record_update() return json(['code' => -1, 'msg' => '参数不能为空']); } + $reservedCheck = $this->checkReservedRecord($name); + if ($reservedCheck['is_reserved']) { + return json(['code' => -1, 'msg' => $reservedCheck['msg']]); + } + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); $recordid = $dns->updateDomainRecord($recordid, $name, $type, $value, $line, $ttl, $mx, $weight, $remark); if ($recordid) { @@ -881,10 +891,17 @@ public function record_batch_add() $success = 0; $fail = 0; + $reservedList = []; foreach ($recordlist as $record) { $record = trim($record); $arr = explode(' ', $record); if (empty($record) || empty($arr[0]) || empty($arr[1])) continue; + $reservedCheck = $this->checkReservedRecord($arr[0]); + if ($reservedCheck['is_reserved']) { + $reservedList[] = $arr[0]; + $fail++; + continue; + } $thistype = empty($type) ? getDnsType($arr[1]) : $type; $recordid = $dns->addDomainRecord($arr[0], $thistype, $arr[1], $line, $ttl, $mx, null, $remark); if ($recordid) { @@ -1469,4 +1486,141 @@ public function domain_set_category() $count = Db::name('domain')->where('id', 'in', $ids)->update(['cid' => $cid]); return json(['code' => 0, 'msg' => '成功设置' . $count . '个域名的分类!']); } + + public function record_export() + { + $id = input('param.id/d'); + $format = input('get.format', 'json', 'trim'); + $page = input('get.page/d', 0); + $pagesize = input('get.pagesize/d', 100); + + $drow = Db::name('domain')->where('id', $id)->find(); + if (!$drow) { + return json(['code' => -1, 'msg' => '域名不存在']); + } + if (!checkPermission(0, $drow['name'])) return json(['code' => -1, 'msg' => '无权限']); + + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); + + if ($page === 0) { + $recordLine = cache('record_line_' . $id); + $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); + return json([ + 'code' => 0, + 'data' => [ + 'domain' => $drow['name'], + 'dnstype' => $dnstype, + 'recordLine' => $recordLine, + 'pagesize' => min($pagesize, 100) + ] + ]); + } + + $domainRecords = $dns->getDomainRecords($page, $pagesize); + if (!$domainRecords) return json(['code' => -1, 'msg' => '获取解析记录失败,' . $dns->getError()]); + + $recordLine = cache('record_line_' . $id); + $records = []; + foreach ($domainRecords['list'] as $row) { + $lineName = isset($recordLine[$row['Line']]) ? $recordLine[$row['Line']]['name'] : $row['Line']; + $records[] = [ + 'Name' => $row['Name'], + 'Type' => $row['Type'], + 'Value' => is_array($row['Value']) ? implode(',', $row['Value']) : $row['Value'], + 'Line' => $row['Line'], + 'LineName' => $lineName, + 'TTL' => $row['TTL'], + 'MX' => $row['MX'] ?? '', + 'Weight' => $row['Weight'] ?? '', + 'Remark' => $row['Remark'] ?? '', + 'Status' => $row['Status'], + ]; + } + + return json([ + 'code' => 0, + 'data' => [ + 'records' => $records, + 'total' => $domainRecords['total'], + 'page' => $page, + 'hasMore' => count($records) == $pagesize + ] + ]); + } + + public function record_import() + { + $id = input('param.id/d'); + $drow = Db::name('domain')->where('id', $id)->find(); + if (!$drow) { + return $this->alert('error', '域名不存在'); + } + $dnstype = Db::name('account')->where('id', $drow['aid'])->value('type'); + if (!checkPermission(0, $drow['name'])) return $this->alert('error', '无权限'); + + if (request()->isAjax()) { + $name = input('post.name', null, 'trim'); + $type = input('post.type', null, 'trim'); + $value = input('post.value', null, 'trim'); + $line = input('post.line', null, 'trim'); + $ttl = input('post.ttl/d', 600); + $mx = input('post.mx/d', 1); + $weight = input('post.weight/d', 0); + $remark = input('post.remark', null, 'trim'); + + if (empty($name) || empty($type) || empty($value)) { + return json(['code' => -1, 'msg' => '参数不能为空']); + } + + $dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']); + $recordid = $dns->addDomainRecord($name, $type, $value, $line, $ttl, $mx, $weight, $remark); + if ($recordid) { + $this->add_log($drow['name'], '导入解析', $name.' ['.$type.'] '.$value.' (线路:'.$line.' TTL:'.$ttl.')'); + return json(['code' => 0, 'msg' => '添加解析记录成功!']); + } else { + return json(['code' => -1, 'msg' => '添加解析记录失败,' . $dns->getError()]); + } + } + + list($recordLine, $minTTL) = $this->get_line_and_ttl($drow); + + $recordLineArr = []; + foreach ($recordLine as $key => $item) { + $recordLineArr[] = ['id' => strval($key), 'name' => $item['name'], 'parent' => $item['parent']]; + } + + $dnsconfig = DnsHelper::$dns_config[$dnstype]; + $dnsconfig['type'] = $dnstype; + + View::assign('domainId', $id); + View::assign('domainName', $drow['name']); + View::assign('recordLine', $recordLineArr); + View::assign('minTTL', $minTTL ? $minTTL : 1); + View::assign('dnsconfig', $dnsconfig); + return view('import'); + } + + private function checkReservedRecord($recordName) + { + if (isset(request()->user['level']) && request()->user['level'] == 2) { + return ['is_reserved' => false]; + } + + $reservedConfig = config_get('reserved_records', ''); + if (empty($reservedConfig)) { + return ['is_reserved' => false]; + } + + $reservedList = array_map('trim', explode(',', $reservedConfig)); + $reservedList = array_filter($reservedList); + + if (in_array($recordName, $reservedList)) { + return [ + 'is_reserved' => true, + 'msg' => '主机记录 "' . $recordName . '" 已被系统预留,无法使用' + ]; + } + + return ['is_reserved' => false]; + } } diff --git a/app/controller/User.php b/app/controller/User.php index 91242ce8..58d30d89 100644 --- a/app/controller/User.php +++ b/app/controller/User.php @@ -185,4 +185,31 @@ public function log_data() return json(['total' => $total, 'rows' => $rows]); } + + public function api_manage() + { + if (!checkPermission(1)) return json(['code' => -1, 'msg' => '无权限']); + + $act = input('param.act'); + $userId = $this->request->user['id']; + + if ($act == 'enable_api') { + $apikey = random(16); + Db::name('user')->where('id', $userId)->update([ + 'is_api' => 1, + 'apikey' => $apikey + ]); + return json(['code' => 0, 'msg' => 'API接口已开启', 'apikey' => $apikey]); + } elseif ($act == 'regenerate_apikey') { + $user = Db::name('user')->where('id', $userId)->find(); + if ($user['is_api'] != 1) { + return json(['code' => -1, 'msg' => 'API接口未开启']); + } + $apikey = random(16); + Db::name('user')->where('id', $userId)->update(['apikey' => $apikey]); + return json(['code' => 0, 'msg' => 'API密钥已重新生成', 'apikey' => $apikey]); + } + + return json(['code' => -3, 'msg' => '未知操作']); + } } diff --git a/app/view/common/layout.html b/app/view/common/layout.html index 2804f6c3..2a7b4f31 100644 --- a/app/view/common/layout.html +++ b/app/view/common/layout.html @@ -106,6 +106,9 @@ {if request()->user['type'] eq 'user'}
| 接口地址 | +
+ {$siteurl}/
+
+ |
+
| 账户UID | +
+ {$user.id}
+
+ |
+
| API密钥 | +
+ {if $user.is_api == 1}
+ {$user.apikey}
+
+
+ {else}
+ API接口未开启
+ 开启API
+ {/if}
+ |
+
| API接口状态 | ++ {if $user.is_api == 1} + 已开启 + {else} + 未开启 + {/if} + | +
您可以通过API将本账户可管理的域名对接到您自己的聚合DNS管理系统中,实现统一管理。 +
+系统下载:
++ 下载聚合DNS管理系统 +
+使用教程:
+