Files
dnsmgr/app/view/cert/cname.html
T
2026-05-18 11:06:09 +08:00

257 lines
8.6 KiB
HTML

{extend name="common/layout" /}
{block name="title"}CMAME代理记录管理{/block}
{block name="main"}
<style>
.copy-btn{color:#52c41a;cursor:pointer;margin-right: 5px;}
.copy-btn:hover{color:#85ef79;}
.btn-refresh{margin-left:5px;font-size:10px;background-color:#6896cf}
tbody tr>td:nth-child(3){word-break:break-all;max-width:180px;}
tbody tr>td:nth-child(4){word-break:break-all;max-width:260px;}
</style>
<div class="modal" id="modal-store" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static">
<div class="modal-dialog">
<div class="modal-content animated flipInX">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span
aria-hidden="true">&times;</span><span
class="sr-only">Close</span></button>
<h4 class="modal-title" id="modal-title">添加CNAME代理</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" id="form-store">
<input type="hidden" name="action"/>
<input type="hidden" name="id"/>
<div class="form-group">
<label class="col-sm-3 control-label no-padding-right">被代理域名</label>
<div class="col-sm-9">
<input type="text" class="form-control" name="domain" onchange="changeDomain(this)" placeholder="需要申请SSL证书但未在本系统添加的域名" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">CNAME记录值</label>
<div class="col-sm-9"><div class="input-group">
<input type="text" name="rr" placeholder="自定义主机记录" class="form-control" required><span class="input-group-addon">.</span>
<select name="did" class="form-control" required>
{foreach $domains as $k=>$v}
<option value="{$k}">{$v}</option>
{/foreach}
</select></div></div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-white" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="store" onclick="save()">保存</button>
</div>
</div>
</div>
</div>
<div class="panel panel-default"><div class="panel-body"><p>CNAME代理可以让未在本系统添加的域名自动申请SSL证书,支持所有DNS服务商。</p><p>注:仅支持基于ACME的证书类型,不支持腾讯云等云厂商SSL证书。</p></div></div>
<div class="row">
<div class="col-xs-12 center-block" style="float: none;">
<div class="panel panel-default panel-intro">
<div class="panel-body">
<form onsubmit="return searchSubmit()" method="GET" class="form-inline" id="searchToolbar">
<div class="form-group">
<label>搜索</label>
<input type="text" class="form-control" name="kw" placeholder="被代理域名">
</div>
<button type="submit" class="btn btn-primary"><i class="fa fa-search"></i> 搜索</button>
<a href="javascript:searchClear()" class="btn btn-default" title="刷新列表"><i class="fa fa-refresh"></i> 刷新</a>
<a href="javascript:addframe()" class="btn btn-success"><i class="fa fa-plus"></i> 添加</a>
</form>
<table id="listTable">
</table>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="/static/js/layer/layer.js"></script>
<script src="/static/js/clipboard-1.7.1.min.js"></script>
<script src="/static/js/bootstrap-table-1.21.4.min.js"></script>
<script src="/static/js/bootstrap-table-page-jump-to-1.21.4.min.js"></script>
<script src="/static/js/custom.js?v=1006"></script>
<script>
$(document).ready(function(){
updateToolbar();
const pageSizeKey = 'cname_pagesize';
const pageNumber = typeof window.$_GET['pageNumber'] != 'undefined' ? parseInt(window.$_GET['pageNumber']) : 1;
const pageSize = getStoredPageSize(pageSizeKey);
var urlSort = typeof window.$_GET['sortName'] != 'undefined' ? window.$_GET['sortName'] : undefined;
var urlOrder = typeof window.$_GET['sortOrder'] != 'undefined' ? window.$_GET['sortOrder'] : undefined;
$("#listTable").bootstrapTable({
url: '/cert/cname/data',
pageNumber: pageNumber,
pageSize: pageSize,
classes: 'table table-striped table-hover table-bordered',
uniqueId: 'id',
sortReset: false,
sortName: urlSort,
sortOrder: urlOrder,
columns: [
{
field: 'id',
title: 'ID',
sortable: true
},
{
field: 'domain',
title: '被代理域名',
sortable: true
},
{
field: 'host',
title: '主机记录',
formatter: function(value, row, index) {
return value + '<a href="javascript:;" data-clipboard-text="'+value+'" class="copy-btn pull-right"><i class="fa fa-copy"></i></a>';
}
},
{
field: 'record',
title: 'CNAME记录值',
formatter: function(value, row, index) {
return value + '<a href="javascript:;" data-clipboard-text="'+value+'" class="copy-btn pull-right"><i class="fa fa-copy"></i></a>';
}
},
{
field: 'status',
title: '状态',
sortable: true,
formatter: function(value, row, index) {
var html = '';
if(value == 1) {
html += '<span class="label label-success">已验证</span>';
} else {
html += '<span class="label label-warning">未验证</span>';
}
html += '<a href="javascript:checkItem('+row.id+')" title="立即验证" class="btn btn-primary btn-xs btn-refresh"><i class="fa fa-refresh"></i></a>';
return html;
}
},
{
field: 'addtime',
title: '添加时间',
sortable: true
},
{
field: 'action',
title: '操作',
formatter: function(value, row, index) {
var html = '<a href="javascript:editframe('+row.id+')" class="btn btn-primary btn-xs">编辑</a> <a href="javascript:delItem('+row.id+')" class="btn btn-danger btn-xs">删除</a>';
return html;
}
},
],
onLoadSuccess: function(data){
var clipboard = new Clipboard('.copy-btn');
clipboard.on('success', function (e) {
layer.msg('复制成功!', {icon: 1, time: 600});
});
clipboard.on('error', function (e) {
layer.msg('复制失败', {icon: 2});
});
},
onPageChange: function(number, size){
setStoredPageSize(pageSizeKey, size);
},
})
})
function addframe(){
$("#modal-store").modal('show');
$("#modal-title").html("添加CNAME代理");
$("#form-store input[name=action]").val("add");
$("#form-store input[name=id]").val('');
$("#form-store input[name=domain]").val('');
$("#form-store input[name=domain]").prop('readonly', false);
$("#form-store input[name=rr]").val('');
var defaultDid = getCookie('cname_did');
if(defaultDid){
$("#form-store select[name=did]").val(defaultDid);
}
}
function editframe(id){
var row = $("#listTable").bootstrapTable('getRowByUniqueId', id);
$("#modal-store").modal('show');
$("#modal-title").html("修改CNAME代理");
$("#form-store input[name=action]").val("edit");
$("#form-store input[name=id]").val(id);
$("#form-store input[name=domain]").val(row.domain);
$("#form-store input[name=domain]").prop('readonly', true);
$("#form-store input[name=rr]").val(row.rr);
$("#form-store select[name=did]").val(row.did);
}
function changeDomain(obj){
var domain = $(obj).val();
if(domain == '') {
$("#form-store input[name=rr]").val('');
return;
}
var rr = domain.replace(/\./g, '-') + '.cname';
$("#form-store input[name=rr]").val(rr);
}
function save(){
if($("#form-store input[name=domain]").val()=='' || $("#form-store input[name=rr]").val()==''){
layer.alert('请确保各项不能为空!');return false;
}
var act = $("#form-store input[name=action]").val();
var ii = layer.load(2);
$.ajax({
type : 'POST',
url : '/cert/cname/'+act,
data : $("#form-store").serialize(),
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.code == 0){
setCookie('cname_did', $("#form-store select[name=did]").val(), 2562000);
layer.alert(data.msg,{
icon: 1,
closeBtn: false
}, function(){
layer.closeAll();
$("#modal-store").modal('hide');
searchRefresh();
});
}else{
layer.alert(data.msg, {icon: 2})
}
}
});
}
function delItem(id){
layer.confirm('确定要删除此CNAME代理记录吗?', {
btn: ['确定','取消']
}, function(){
$.post('/cert/cname/del', {id: id}, function(data){
if(data.code == 0) {
layer.msg('删除成功', {icon: 1, time:800});
searchRefresh();
} else {
layer.msg(data.msg, {icon: 2});
}
}, 'json');
});
}
function checkItem(id){
var ii = layer.load(2);
$.post('/cert/cname/check', {id: id}, function(data){
layer.close(ii);
if(data.code == 0) {
if(data.status == 1){
layer.alert('验证已通过!', {icon: 6});
}else{
layer.alert('验证未通过,请按要求添加CNAME解析', {icon: 5});
}
searchRefresh();
} else {
layer.alert(data.msg, {icon: 2});
}
}, 'json');
}
</script>
{/block}