mirror of
https://github.com/netcccyun/dnsmgr.git
synced 2026-02-21 07:17:22 +08:00
新增宝塔云WAF部署 支持修改域名到期时间
This commit is contained in:
parent
8a158ea0a5
commit
3734e98048
@ -434,8 +434,9 @@ function curl_client($url, $data = null, $referer = null, $cookie = null, $heade
|
||||
$ret = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
|
||||
|
||||
@ -276,6 +276,7 @@ class Cert extends BaseController
|
||||
'addtime' => date('Y-m-d H:i:s'),
|
||||
'issuer' => '',
|
||||
'status' => 0,
|
||||
'isauto' => 1,
|
||||
];
|
||||
$domains = array_map('trim', $domains);
|
||||
$domains = array_filter($domains, function ($v) {
|
||||
|
||||
@ -250,12 +250,14 @@ class Domain extends BaseController
|
||||
$is_hide = input('post.is_hide/d');
|
||||
$is_sso = input('post.is_sso/d');
|
||||
$is_notice = input('post.is_notice/d');
|
||||
$expiretime = input('post.expiretime', null, 'trim');
|
||||
$remark = input('post.remark', null, 'trim');
|
||||
if (empty($remark)) $remark = null;
|
||||
Db::name('domain')->where('id', $id)->update([
|
||||
'is_hide' => $is_hide,
|
||||
'is_sso' => $is_sso,
|
||||
'is_notice' => $is_notice,
|
||||
'expiretime' => $expiretime ? $expiretime : null,
|
||||
'remark' => $remark,
|
||||
]);
|
||||
return json(['code' => 0, 'msg' => '修改域名配置成功!']);
|
||||
@ -419,8 +421,8 @@ class Domain extends BaseController
|
||||
$type = input('post.type', null, 'trim');
|
||||
$line = input('post.line', null, 'trim');
|
||||
$status = input('post.status', null, 'trim');
|
||||
$offset = input('post.offset/d');
|
||||
$limit = input('post.limit/d');
|
||||
$offset = input('post.offset/d', 0);
|
||||
$limit = input('post.limit/d', 10);
|
||||
if ($limit == 0) {
|
||||
$page = 1;
|
||||
} else {
|
||||
@ -543,10 +545,14 @@ class Domain extends BaseController
|
||||
$dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']);
|
||||
$recordid = $dns->updateDomainRecord($recordid, $name, $type, $value, $line, $ttl, $mx, $weight, $remark);
|
||||
if ($recordid) {
|
||||
if (is_array($recordinfo['Value'])) $recordinfo['Value'] = implode(',', $recordinfo['Value']);
|
||||
if ($recordinfo['Name'] != $name || $recordinfo['Type'] != $type || $recordinfo['Value'] != $value) {
|
||||
$this->add_log($drow['name'], '修改解析', $recordinfo['Name'].' ['.$recordinfo['Type'].'] '.$recordinfo['Value'].' → '.$name.' ['.$type.'] '.$value.' (线路:'.$line.' TTL:'.$ttl.')');
|
||||
} elseif($recordinfo['Line'] != $line || $recordinfo['TTL'] != $ttl) {
|
||||
if ($recordinfo) {
|
||||
if (is_array($recordinfo['Value'])) $recordinfo['Value'] = implode(',', $recordinfo['Value']);
|
||||
if ($recordinfo['Name'] != $name || $recordinfo['Type'] != $type || $recordinfo['Value'] != $value) {
|
||||
$this->add_log($drow['name'], '修改解析', $recordinfo['Name'].' ['.$recordinfo['Type'].'] '.$recordinfo['Value'].' → '.$name.' ['.$type.'] '.$value.' (线路:'.$line.' TTL:'.$ttl.')');
|
||||
} elseif($recordinfo['Line'] != $line || $recordinfo['TTL'] != $ttl) {
|
||||
$this->add_log($drow['name'], '修改解析', $name.' ['.$type.'] '.$value.' (线路:'.$line.' TTL:'.$ttl.')');
|
||||
}
|
||||
} else {
|
||||
$this->add_log($drow['name'], '修改解析', $name.' ['.$type.'] '.$value.' (线路:'.$line.' TTL:'.$ttl.')');
|
||||
}
|
||||
return json(['code' => 0, 'msg' => '修改解析记录成功!']);
|
||||
@ -790,6 +796,9 @@ class Domain extends BaseController
|
||||
}
|
||||
if (is_null($line)) {
|
||||
$line = DnsHelper::$line_name[$dnstype]['DEF'];
|
||||
if ($dnstype == 'cloudflare' && input('post.proxy/d', 0) == 1) {
|
||||
$line = '1';
|
||||
}
|
||||
}
|
||||
|
||||
$dns = DnsHelper::getModel($drow['aid'], $drow['name'], $drow['thirdid']);
|
||||
|
||||
@ -288,6 +288,7 @@ uk.com
|
||||
us.com
|
||||
uy.com
|
||||
za.com
|
||||
it.com
|
||||
co.cr
|
||||
ed.cr
|
||||
fi.cr
|
||||
@ -1341,6 +1342,7 @@ zagan.pl
|
||||
zarow.pl
|
||||
zgora.pl
|
||||
zgorzelec.pl
|
||||
co.pl
|
||||
co.pn
|
||||
net.pn
|
||||
org.pn
|
||||
@ -1925,4 +1927,18 @@ edu.kg
|
||||
edu.cn
|
||||
eu.org
|
||||
us.kg
|
||||
ggff.net
|
||||
xx.kg
|
||||
qzz.io
|
||||
dpdns.org
|
||||
ggff.net
|
||||
ac.ru
|
||||
edu.ru
|
||||
com.ru
|
||||
msk.ru
|
||||
net.ru
|
||||
nov.ru
|
||||
org.ru
|
||||
pp.ru
|
||||
spb.ru
|
||||
uk.co
|
||||
gov.scot
|
||||
@ -229,6 +229,45 @@ class DeployHelper
|
||||
],
|
||||
'taskinputs' => [],
|
||||
],
|
||||
'btwaf' => [
|
||||
'name' => '堡塔云WAF',
|
||||
'class' => 1,
|
||||
'icon' => 'bt.ico',
|
||||
'note' => null,
|
||||
'tasknote' => '',
|
||||
'inputs' => [
|
||||
'url' => [
|
||||
'name' => '面板地址',
|
||||
'type' => 'input',
|
||||
'placeholder' => '堡塔云WAF面板地址',
|
||||
'note' => '填写规则如:http://192.168.1.100:8379 ,不要带其他后缀',
|
||||
'required' => true,
|
||||
],
|
||||
'key' => [
|
||||
'name' => '接口密钥',
|
||||
'type' => 'input',
|
||||
'placeholder' => '面板设置->API接口',
|
||||
'required' => true,
|
||||
],
|
||||
'proxy' => [
|
||||
'name' => '使用代理服务器',
|
||||
'type' => 'radio',
|
||||
'options' => [
|
||||
'0' => '否',
|
||||
'1' => '是',
|
||||
],
|
||||
'value' => '0'
|
||||
],
|
||||
],
|
||||
'taskinputs' => [
|
||||
'sites' => [
|
||||
'name' => '网站名称列表',
|
||||
'type' => 'textarea',
|
||||
'placeholder' => '填写要部署证书的网站名称,每行一个',
|
||||
'required' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
'cdnfly' => [
|
||||
'name' => 'Cdnfly',
|
||||
'class' => 1,
|
||||
|
||||
@ -15,14 +15,15 @@ class tencent implements CertInterface
|
||||
private $service = "ssl";
|
||||
private $version = "2019-12-05";
|
||||
private $logger;
|
||||
private $proxy;
|
||||
private TencentCloud $client;
|
||||
|
||||
public function __construct($config, $ext = null)
|
||||
{
|
||||
$this->SecretId = $config['SecretId'];
|
||||
$this->SecretKey = $config['SecretKey'];
|
||||
$proxy = isset($config['proxy']) ? $config['proxy'] == 1 : false;
|
||||
$this->client = new TencentCloud($this->SecretId, $this->SecretKey, $this->endpoint, $this->service, $this->version, null, $proxy);
|
||||
$this->proxy = isset($config['proxy']) ? $config['proxy'] == 1 : false;
|
||||
$this->client = new TencentCloud($this->SecretId, $this->SecretKey, $this->endpoint, $this->service, $this->version, null, $this->proxy);
|
||||
$this->email = $config['email'];
|
||||
}
|
||||
|
||||
@ -102,7 +103,9 @@ class tencent implements CertInterface
|
||||
'ServiceType' => 'nginx',
|
||||
];
|
||||
$data = $this->request('DescribeDownloadCertificateUrl', $param);
|
||||
$file_data = get_curl($data['DownloadCertificateUrl']);
|
||||
$file_data = curl_client($data['DownloadCertificateUrl'], null, null, null, null, $this->proxy);
|
||||
$file_data = $file_data['body'] ?? null;
|
||||
if (empty($file_data)) throw new Exception('下载证书失败');
|
||||
$file_path = app()->getRuntimePath() . 'cert/' . $data['DownloadFilename'];
|
||||
$file_name = substr($data['DownloadFilename'], 0, -4);
|
||||
file_put_contents($file_path, $file_data);
|
||||
|
||||
@ -285,8 +285,9 @@ class AWS
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if ($etag) {
|
||||
|
||||
@ -62,8 +62,9 @@ class Aliyun
|
||||
$errno = curl_errno($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -168,8 +168,9 @@ class AliyunNew
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
@ -119,8 +119,9 @@ class AliyunOSS
|
||||
$errno = curl_errno($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -158,8 +158,9 @@ class BaiduCloud
|
||||
$errno = curl_errno($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -144,8 +144,9 @@ class Ctyun
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -163,8 +163,9 @@ class HuaweiCloud
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
@ -167,8 +167,9 @@ class Jdcloud
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
@ -121,8 +121,9 @@ class Qiniu
|
||||
$errno = curl_errno($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -113,8 +113,9 @@ class TencentCloud
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
curl_close($ch);
|
||||
|
||||
|
||||
@ -218,8 +218,9 @@ class Volcengine
|
||||
$response = curl_exec($ch);
|
||||
$errno = curl_errno($ch);
|
||||
if ($errno) {
|
||||
$errmsg = curl_error($ch);
|
||||
curl_close($ch);
|
||||
throw new Exception('Curl error: ' . curl_error($ch));
|
||||
throw new Exception('Curl error: ' . $errmsg);
|
||||
}
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
134
app/lib/deploy/btwaf.php
Normal file
134
app/lib/deploy/btwaf.php
Normal file
@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
namespace app\lib\deploy;
|
||||
|
||||
use app\lib\DeployInterface;
|
||||
use Exception;
|
||||
|
||||
class btwaf implements DeployInterface
|
||||
{
|
||||
private $logger;
|
||||
private $url;
|
||||
private $key;
|
||||
private $proxy;
|
||||
|
||||
public function __construct($config)
|
||||
{
|
||||
$this->url = rtrim($config['url'], '/');
|
||||
$this->key = $config['key'];
|
||||
$this->proxy = $config['proxy'] == 1;
|
||||
}
|
||||
|
||||
public function check()
|
||||
{
|
||||
if (empty($this->url) || empty($this->key)) throw new Exception('请填写面板地址和接口密钥');
|
||||
|
||||
$path = '/api/user/latest_version';
|
||||
$response = $this->request($path, []);
|
||||
$result = json_decode($response, true);
|
||||
if (isset($result['code']) && $result['code'] == 0) {
|
||||
return true;
|
||||
} else {
|
||||
throw new Exception(isset($result['res']) ? $result['res'] : '面板地址无法连接');
|
||||
}
|
||||
}
|
||||
|
||||
public function deploy($fullchain, $privatekey, $config, &$info)
|
||||
{
|
||||
$sites = explode("\n", $config['sites']);
|
||||
$success = 0;
|
||||
$errmsg = null;
|
||||
foreach ($sites as $site) {
|
||||
$siteName = trim($site);
|
||||
if (empty($siteName)) continue;
|
||||
try {
|
||||
$this->deploySite($siteName, $fullchain, $privatekey);
|
||||
$this->log("网站 {$siteName} 证书部署成功");
|
||||
$success++;
|
||||
} catch (Exception $e) {
|
||||
$errmsg = $e->getMessage();
|
||||
$this->log("网站 {$siteName} 证书部署失败:" . $errmsg);
|
||||
}
|
||||
}
|
||||
if ($success == 0) {
|
||||
throw new Exception($errmsg ? $errmsg : '要部署的网站不存在');
|
||||
}
|
||||
}
|
||||
|
||||
private function deploySite($siteName, $fullchain, $privatekey)
|
||||
{
|
||||
$site_id = null;
|
||||
$listen_ssl_port = ['443'];
|
||||
$path = '/api/wafmastersite/get_site_list';
|
||||
$data = ['p' => 1, 'p_size' => 10, 'site_name' => $siteName];
|
||||
$response = $this->request($path, $data);
|
||||
$result = json_decode($response, true);
|
||||
if (isset($result['code']) && $result['code'] == 0) {
|
||||
foreach ($result['res']['list'] as $site) {
|
||||
if ($site['site_name'] == $siteName) {
|
||||
$site_id = $site['site_id'];
|
||||
if (isset($site['server']['listen_ssl_port']) && !empty($site['server']['listen_ssl_port'])) {
|
||||
$listen_ssl_port = $site['server']['listen_ssl_port'];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$site_id) {
|
||||
throw new Exception("网站名称不存在");
|
||||
}
|
||||
} elseif (isset($result['res'])) {
|
||||
throw new Exception($result['res']);
|
||||
} else {
|
||||
throw new Exception($response ? $response : '返回数据解析失败');
|
||||
}
|
||||
$path = '/api/wafmastersite/modify_site';
|
||||
$data = [
|
||||
'types' => 'openCert',
|
||||
'site_id' => $site_id,
|
||||
'server' => [
|
||||
'listen_ssl_port' => $listen_ssl_port,
|
||||
'ssl' => [
|
||||
'is_ssl' => 1,
|
||||
'private_key' => $privatekey,
|
||||
'full_chain' => $fullchain,
|
||||
],
|
||||
]
|
||||
];
|
||||
$response = $this->request($path, $data);
|
||||
$result = json_decode($response, true);
|
||||
if (isset($result['code']) && $result['code'] == 0) {
|
||||
return true;
|
||||
} elseif (isset($result['res'])) {
|
||||
throw new Exception($result['res']);
|
||||
} else {
|
||||
throw new Exception($response ? $response : '返回数据解析失败');
|
||||
}
|
||||
}
|
||||
|
||||
public function setLogger($func)
|
||||
{
|
||||
$this->logger = $func;
|
||||
}
|
||||
|
||||
private function log($txt)
|
||||
{
|
||||
if ($this->logger) {
|
||||
call_user_func($this->logger, $txt);
|
||||
}
|
||||
}
|
||||
|
||||
private function request($path, $params)
|
||||
{
|
||||
$url = $this->url . $path;
|
||||
|
||||
$now_time = time();
|
||||
$headers = [
|
||||
'waf_request_time: ' . $now_time,
|
||||
'waf_request_token: ' . md5($now_time . md5($this->key)),
|
||||
'Content-Type: application/json',
|
||||
];
|
||||
$post = $params ? json_encode($params) : null;
|
||||
$response = curl_client($url, $post, null, null, $headers, $this->proxy, 'POST');
|
||||
return $response['body'];
|
||||
}
|
||||
}
|
||||
@ -14,7 +14,7 @@ class opanel implements DeployInterface
|
||||
|
||||
public function __construct($config)
|
||||
{
|
||||
$this->url = rtrim($config['url'], '/') . '/api/' . $config['version'] ?: 'v1';
|
||||
$this->url = rtrim($config['url'], '/') . '/api/' . (isset($config['version']) ? $config['version'] : 'v1');
|
||||
$this->key = $config['key'];
|
||||
$this->proxy = $config['proxy'] == 1;
|
||||
}
|
||||
|
||||
@ -37,6 +37,17 @@ tbody tr>td:nth-child(3){min-width:300px;word-break:break-all;}
|
||||
<div class="col-sm-6">
|
||||
<select name="line" class="form-control" disabled><option value="default">默认</option></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" v-if="existCF">
|
||||
<label class="col-sm-3 control-label no-padding-right">开启反代</label>
|
||||
<div class="col-sm-6">
|
||||
<label class="radio-inline">
|
||||
<input type="radio" name="proxy" value="0" v-model="set.proxy"> 否
|
||||
</label>
|
||||
<label class="radio-inline">
|
||||
<input type="radio" name="proxy" value="1" v-model="set.proxy"> 是(仅Cloudflare域名)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="display:none" id="mx_type">
|
||||
<label class="col-sm-3 control-label no-padding-right">MX优先级</label>
|
||||
@ -91,7 +102,9 @@ new Vue({
|
||||
type: '',
|
||||
mx: 10,
|
||||
ttl: 600,
|
||||
}
|
||||
proxy: 0,
|
||||
},
|
||||
existCF: false,
|
||||
},
|
||||
watch: {
|
||||
'set.type': function(val){
|
||||
@ -112,6 +125,7 @@ new Vue({
|
||||
for(var i=0; i<this.domainList.length; i++){
|
||||
this.$set(this.domainList[i], 'result', '<span class="text-muted">待添加</span>');
|
||||
}
|
||||
this.existCF = this.domainList.some(item => item.type === 'cloudflare');
|
||||
},
|
||||
methods: {
|
||||
async save(id){
|
||||
|
||||
@ -40,7 +40,7 @@ tbody tr>td:nth-child(3){min-width:300px;word-break:break-all;}
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label no-padding-right">记录值</label>
|
||||
<div class="col-sm-6">
|
||||
<input type="text" class="form-control" name="value" v-model="set.value" placeholder="输入记录值" required>
|
||||
<input type="text" class="form-control" name="value" v-model="set.value" placeholder="输入新的记录值" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="display:none" id="mx_type">
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
{extend name="common/layout" /}
|
||||
{block name="title"}域名管理{/block}
|
||||
{block name="main"}
|
||||
<link href="{$cdnpublic}bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css" rel="stylesheet">
|
||||
<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">
|
||||
@ -50,6 +51,12 @@
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" id="form-store2">
|
||||
<input type="hidden" name="id"/>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">到期时间</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" class="form-control" name="expiretime" placeholder="" value="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">到期提醒</label>
|
||||
<div class="col-sm-9">
|
||||
@ -137,6 +144,9 @@
|
||||
</div>
|
||||
{/block}
|
||||
{block name="script"}
|
||||
<script src="{$cdnpublic}moment.js/2.29.4/moment.min.js"></script>
|
||||
<script src="{$cdnpublic}moment.js/2.29.4/locale/zh-cn.js"></script>
|
||||
<script src="{$cdnpublic}bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
|
||||
<script src="{$cdnpublic}layer/3.1.1/layer.js"></script>
|
||||
<script src="{$cdnpublic}bootstrap-table/1.21.4/bootstrap-table.min.js"></script>
|
||||
<script src="{$cdnpublic}bootstrap-table/1.21.4/extensions/page-jump-to/bootstrap-table-page-jump-to.min.js"></script>
|
||||
@ -334,6 +344,12 @@ function editframe(id){
|
||||
$("#form-store2 select[name=is_sso]").val(row.is_sso);
|
||||
$("#form-store2 select[name=is_notice]").val(row.is_notice);
|
||||
$("#form-store2 input[name=remark]").val(row.remark);
|
||||
|
||||
$("#form-store2 input[name=expiretime]").datetimepicker({
|
||||
format: 'YYYY-MM-DD HH:mm:ss',
|
||||
locale: 'zh-cn',
|
||||
defaultDate: row.expiretime,
|
||||
}).val(row.expiretime);
|
||||
}
|
||||
function saveEdit(){
|
||||
var ii = layer.load(2);
|
||||
@ -549,4 +565,4 @@ document.addEventListener("visibilitychange", function() {
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
{/block}
|
||||
|
||||
@ -31,7 +31,7 @@ return [
|
||||
'show_error_msg' => true,
|
||||
'exception_tmpl' => \think\facade\App::getAppPath() . 'view/exception.tpl',
|
||||
|
||||
'version' => '1033',
|
||||
'version' => '1035',
|
||||
|
||||
'dbversion' => '1033'
|
||||
];
|
||||
|
||||
Loading…
Reference in New Issue
Block a user