更新
This commit is contained in:
commit
23bdf836b5
1
assets/css/joe.config.css
Normal file
1
assets/css/joe.config.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
.col-mb-12.col-tb-8.col-tb-offset-2{margin-left:0;width:100%}.joe_config{display:flex}.joe_config *{margin:0;padding:0;box-sizing:border-box;outline:none;-webkit-tap-highlight-color:transparent}.joe_config li{list-style:none}.joe_config__aside{position:-webkit-sticky;position:sticky;top:15px;width:200px;background:#fff;padding:10px;box-shadow:0px 0px 20px -5px rgba(158,158,158,0.22);border-radius:8px}.joe_config__aside .logo{color:#303133;font-weight:500;font-size:24px;text-align:center;margin-bottom:10px;border-bottom:1px solid #ebeef5;padding-bottom:10px}.joe_config__aside .tabs{margin-bottom:10px}.joe_config__aside .tabs .item{border-radius:20px;text-align:center;height:40px;line-height:40px;color:#606266;cursor:pointer;transition:background 0.35s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.joe_config__aside .tabs .item:hover{background:#f2f6fc}.joe_config__aside .tabs .item.active{color:#409eff;font-weight:500}.joe_config__aside .backup input{width:170px;height:40px;line-height:40px;margin-bottom:10px;color:#fff;font-size:14px;border-radius:20px;transition:opacity 0.35s;border:none;cursor:pointer}.joe_config__aside .backup input:hover{opacity:0.85}.joe_config__aside .backup input:nth-child(1){background:#5cb85c}.joe_config__aside .backup input:nth-child(2){background:#f0ad4e}.joe_config__aside .backup input:nth-child(3){margin-bottom:0;background:#d9534f}.joe_config>form{position:relative;display:none;background:#fff;min-width:0;flex:1;margin-left:15px;box-shadow:0px 0px 20px -5px rgba(158,158,158,0.22);border-radius:8px}.joe_config>form .typecho-option{position:-webkit-sticky;position:sticky;bottom:0;display:flex;align-items:center;justify-content:center;margin:0;padding:15px;background:#fff;border-top:1px solid #ebebeb;border-radius:0 0 8px 8px}.joe_config>form .typecho-option button{width:170px;height:40px;background-color:#409eff;border-radius:20px}.joe_config>form .typecho-option button:hover{-webkit-animation:pulse 1s;animation:pulse 1s;box-shadow:0 0 0 20px rgba(255,255,255,0)}.joe_config>form .joe_content{display:none;padding:15px}.joe_config>form .joe_content li{border:1px solid #e9e9eb;padding:15px}.joe_config>form .joe_content li .typecho-label{display:block;border-left:4px solid #409eff;background:#ecf5ff;line-height:26px;margin-bottom:15px;padding:5px 15px;color:#409eff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:0 4px 4px 0}.joe_config>form .joe_content li select{min-width:200px;height:34px;line-height:34px;border:1px solid #e9e9eb;color:#666;border-radius:4px;padding-left:5px}.joe_config>form .joe_content li textarea,.joe_config>form .joe_content li input[type="text"]{width:100%;padding:10px;color:#666;border:1px solid #e9e9eb;-webkit-appearance:none}.joe_config>form .joe_content li .description{background:#f8f8f8;color:#999;padding:10px 15px;margin-top:15px;line-height:26px;border-radius:4px}.joe_config__notice{display:none;margin-left:15px;background:#fff;padding:15px;flex:1;box-shadow:0px 0px 20px -5px rgba(158,158,158,0.22);border-radius:8px;line-height:28px;color:#606266}.joe_config__notice ol{padding:0 40px}.joe_config__notice ol li{list-style:decimal}@-webkit-keyframes pulse{0%{box-shadow:0 0 0 0 #409eff}}@keyframes pulse{0%{box-shadow:0 0 0 0 #409eff}}@media (max-width: 768px){.joe_config{display:block}.joe_config__aside{width:100%;margin-bottom:15px}.joe_config__aside .tabs{display:flex;flex-wrap:wrap;border-bottom:1px solid #ebeef5;padding-bottom:10px}.joe_config__aside .tabs .item{width:33.33333333%;height:36px;line-height:36px;border-radius:18px}.joe_config__aside .backup{display:flex;align-items:center;justify-content:space-between}.joe_config__aside .backup input{width:auto;flex:1;margin-bottom:0;height:36px;line-height:36px;border-radius:18px}.joe_config__aside .backup input:nth-child(2){margin:0 10px}.joe_config>form{margin-left:0}.joe_config>form .typecho-option{padding:10px 0}.joe_config>form .typecho-option button{width:150px;height:38px;border-radius:19px}.joe_config__notice{margin-left:0}}
|
242
assets/css/joe.config.scss
Normal file
242
assets/css/joe.config.scss
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
.col-mb-12.col-tb-8.col-tb-offset-2 {
|
||||||
|
margin-left: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.joe_config {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
outline: none;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__aside {
|
||||||
|
position: sticky;
|
||||||
|
top: 15px;
|
||||||
|
width: 200px;
|
||||||
|
background: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
box-shadow: 0px 0px 20px -5px rgba(158, 158, 158, 0.22);
|
||||||
|
border-radius: 8px;
|
||||||
|
.logo {
|
||||||
|
color: #303133;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 24px;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
.tabs {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
.item {
|
||||||
|
border-radius: 20px;
|
||||||
|
text-align: center;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
color: #606266;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.35s;
|
||||||
|
user-select: none;
|
||||||
|
&:hover {
|
||||||
|
background: #f2f6fc;
|
||||||
|
}
|
||||||
|
&.active {
|
||||||
|
color: #409eff;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.backup {
|
||||||
|
input {
|
||||||
|
width: 170px;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 14px;
|
||||||
|
border-radius: 20px;
|
||||||
|
transition: opacity 0.35s;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.85;
|
||||||
|
}
|
||||||
|
&:nth-child(1) {
|
||||||
|
background: #5cb85c;
|
||||||
|
}
|
||||||
|
&:nth-child(2) {
|
||||||
|
background: #f0ad4e;
|
||||||
|
}
|
||||||
|
&:nth-child(3) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
background: #d9534f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> form {
|
||||||
|
position: relative;
|
||||||
|
display: none;
|
||||||
|
background: #fff;
|
||||||
|
min-width: 0;
|
||||||
|
flex: 1;
|
||||||
|
margin-left: 15px;
|
||||||
|
box-shadow: 0px 0px 20px -5px rgba(158, 158, 158, 0.22);
|
||||||
|
border-radius: 8px;
|
||||||
|
.typecho-option {
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin: 0;
|
||||||
|
padding: 15px;
|
||||||
|
background: #fff;
|
||||||
|
border-top: 1px solid #ebebeb;
|
||||||
|
border-radius: 0 0 8px 8px;
|
||||||
|
button {
|
||||||
|
width: 170px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: #409eff;
|
||||||
|
border-radius: 20px;
|
||||||
|
&:hover {
|
||||||
|
animation: pulse 1s;
|
||||||
|
box-shadow: 0 0 0 20px rgba(255, 255, 255, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.joe_content {
|
||||||
|
display: none;
|
||||||
|
padding: 15px;
|
||||||
|
li {
|
||||||
|
border: 1px solid #e9e9eb;
|
||||||
|
padding: 15px;
|
||||||
|
.typecho-label {
|
||||||
|
display: block;
|
||||||
|
border-left: 4px solid #409eff;
|
||||||
|
background: #ecf5ff;
|
||||||
|
line-height: 26px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
padding: 5px 15px;
|
||||||
|
color: #409eff;
|
||||||
|
user-select: none;
|
||||||
|
border-radius: 0 4px 4px 0;
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
min-width: 200px;
|
||||||
|
height: 34px;
|
||||||
|
line-height: 34px;
|
||||||
|
border: 1px solid #e9e9eb;
|
||||||
|
color: #666;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
textarea,
|
||||||
|
input[type="text"] {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px;
|
||||||
|
color: #666;
|
||||||
|
border: 1px solid #e9e9eb;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
background: #f8f8f8;
|
||||||
|
color: #999;
|
||||||
|
padding: 10px 15px;
|
||||||
|
margin-top: 15px;
|
||||||
|
line-height: 26px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__notice {
|
||||||
|
display: none;
|
||||||
|
margin-left: 15px;
|
||||||
|
background: #fff;
|
||||||
|
padding: 15px;
|
||||||
|
flex: 1;
|
||||||
|
box-shadow: 0px 0px 20px -5px rgba(158, 158, 158, 0.22);
|
||||||
|
border-radius: 8px;
|
||||||
|
line-height: 28px;
|
||||||
|
color: #606266;
|
||||||
|
ol {
|
||||||
|
padding: 0 40px;
|
||||||
|
li {
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0% {
|
||||||
|
box-shadow: 0 0 0 0 #409eff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.joe_config {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&__aside {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
.tabs {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
border-bottom: 1px solid #ebeef5;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
.item {
|
||||||
|
width: 33.33333333%;
|
||||||
|
height: 36px;
|
||||||
|
line-height: 36px;
|
||||||
|
border-radius: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.backup {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
input {
|
||||||
|
width: auto;
|
||||||
|
flex: 1;
|
||||||
|
margin-bottom: 0;
|
||||||
|
height: 36px;
|
||||||
|
line-height: 36px;
|
||||||
|
border-radius: 18px;
|
||||||
|
&:nth-child(2) {
|
||||||
|
margin: 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> form {
|
||||||
|
margin-left: 0;
|
||||||
|
.typecho-option {
|
||||||
|
padding: 10px 0;
|
||||||
|
button {
|
||||||
|
width: 150px;
|
||||||
|
height: 38px;
|
||||||
|
border-radius: 19px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__notice {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
77
assets/js/joe.config.js
Normal file
77
assets/js/joe.config.js
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
const TabItems = document.querySelectorAll(".joe_config__aside .item");
|
||||||
|
const Notice = document.querySelector(".joe_config__notice");
|
||||||
|
const Form = document.querySelector(".joe_config > form");
|
||||||
|
const Content = document.querySelectorAll(".joe_content");
|
||||||
|
TabItems.forEach(function (item) {
|
||||||
|
item.addEventListener("click", function () {
|
||||||
|
TabItems.forEach(function (_item) {
|
||||||
|
_item.classList.remove("active");
|
||||||
|
});
|
||||||
|
item.classList.add("active");
|
||||||
|
|
||||||
|
let current = item.getAttribute("data-current");
|
||||||
|
sessionStorage.setItem("joe_config_current", current);
|
||||||
|
|
||||||
|
if (current === "joe_notice") {
|
||||||
|
Notice.style.display = "block";
|
||||||
|
Form.style.display = "none";
|
||||||
|
} else {
|
||||||
|
Notice.style.display = "none";
|
||||||
|
Form.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
Content.forEach(function (_item) {
|
||||||
|
_item.style.display = "none";
|
||||||
|
let flag = _item.classList.contains(current);
|
||||||
|
if (flag) {
|
||||||
|
_item.style.display = "block";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (sessionStorage.getItem("joe_config_current")) {
|
||||||
|
let current = sessionStorage.getItem("joe_config_current");
|
||||||
|
if (current === "joe_notice") {
|
||||||
|
Notice.style.display = "block";
|
||||||
|
Form.style.display = "none";
|
||||||
|
} else {
|
||||||
|
Form.style.display = "block";
|
||||||
|
Notice.style.display = "none";
|
||||||
|
}
|
||||||
|
TabItems.forEach(function (item) {
|
||||||
|
let _current = item.getAttribute("data-current");
|
||||||
|
if (_current === current) item.classList.add("active");
|
||||||
|
});
|
||||||
|
Content.forEach(function (_item) {
|
||||||
|
if (_item.classList.contains(current)) {
|
||||||
|
_item.style.display = "block";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
TabItems[0].classList.add("active");
|
||||||
|
Notice.style.display = "block";
|
||||||
|
Form.style.display = "none";
|
||||||
|
}
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.onreadystatechange = () => {
|
||||||
|
if (xhr.readyState === 4) {
|
||||||
|
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
|
||||||
|
let res = JSON.parse(xhr.responseText);
|
||||||
|
if (res.success) {
|
||||||
|
Notice.innerHTML = res.content;
|
||||||
|
} else {
|
||||||
|
Notice.innerHTML = "请求失败!";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Notice.innerHTML = "请求失败!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.open(
|
||||||
|
"get",
|
||||||
|
"https://ae.js.cn/qqshoucang.php?key=18e958d8c7fa5d435844f95c9f254fca",
|
||||||
|
true
|
||||||
|
);
|
||||||
|
xhr.send(null);
|
||||||
|
});
|
60
core/backup.php
Normal file
60
core/backup.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php $name = "Joe";
|
||||||
|
$db = Typecho_Db::get();
|
||||||
|
if (isset($_POST['type'])) {
|
||||||
|
if ($_POST["type"] == "备份设置") {
|
||||||
|
$value = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name))['value'];
|
||||||
|
if ($db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name . '_backup'))) {
|
||||||
|
$db->query($db->update('table.options')->rows(array('value' => $value))->where('name = ?', 'theme:' . $name . '_backup')); ?>
|
||||||
|
<script>
|
||||||
|
alert("备份更新成功!");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php } else { ?>
|
||||||
|
<?php
|
||||||
|
if ($value) {
|
||||||
|
$db->query($db->insert('table.options')->rows(array('name' => 'theme:' . $name . '_backup', 'user' => '0', 'value' => $value)));
|
||||||
|
?>
|
||||||
|
<script>
|
||||||
|
alert("备份成功!");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($_POST["type"] == "还原备份") {
|
||||||
|
if ($db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name . '_backup'))) {
|
||||||
|
$_value = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name . '_backup'))['value'];
|
||||||
|
$db->query($db->update('table.options')->rows(array('value' => $_value))->where('name = ?', 'theme:' . $name)); ?>
|
||||||
|
<script>
|
||||||
|
alert("还原成功!");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php } else { ?>
|
||||||
|
<script>
|
||||||
|
alert("未备份过数据,无法恢复!");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php } ?>
|
||||||
|
<?php } ?>
|
||||||
|
<?php if ($_POST["type"] == "删除备份") {
|
||||||
|
if ($db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name . '_backup'))) {
|
||||||
|
$db->query($db->delete('table.options')->where('name = ?', 'theme:' . $name . '_backup')); ?>
|
||||||
|
<script>
|
||||||
|
alert("删除成功");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php } else { ?>
|
||||||
|
<script>
|
||||||
|
alert("没有备份内容,无法删除!");
|
||||||
|
window.location.href = '<?php Helper::options()->adminUrl('options-theme.php'); ?>'
|
||||||
|
</script>
|
||||||
|
<?php } ?>
|
||||||
|
<?php } ?>
|
||||||
|
<?php } ?>
|
||||||
|
<?php
|
||||||
|
echo '
|
||||||
|
<form class="backup" action="?Joe_backup" method="post">
|
||||||
|
<input type="submit" name="type" value="备份设置" />
|
||||||
|
<input type="submit" name="type" value="还原备份" />
|
||||||
|
<input type="submit" name="type" value="删除备份" />
|
||||||
|
</form>';
|
6
core/core.php
Normal file
6
core/core.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function _getVersion()
|
||||||
|
{
|
||||||
|
return "1.0.0";
|
||||||
|
};
|
49
functions.php
Normal file
49
functions.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
|
||||||
|
require_once("core/core.php");
|
||||||
|
function themeConfig($form)
|
||||||
|
{
|
||||||
|
$_db = Typecho_Db::get();
|
||||||
|
$_prefix = $_db->getPrefix();
|
||||||
|
try {
|
||||||
|
if (!array_key_exists('view', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
|
||||||
|
$_db->query('ALTER TABLE `' . $_prefix . 'contents` ADD `view` INT DEFAULT 0;');
|
||||||
|
}
|
||||||
|
if (!array_key_exists('agree', $_db->fetchRow($_db->select()->from('table.contents')->page(1, 1)))) {
|
||||||
|
$_db->query('ALTER TABLE `' . $_prefix . 'contents` ADD `agree` INT DEFAULT 0;');
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<link rel="stylesheet" href="<?php Helper::options()->themeUrl('assets/css/joe.config.css') ?>">
|
||||||
|
<script src="<?php Helper::options()->themeUrl('assets/js/joe.config.js') ?>"></script>
|
||||||
|
<div class="joe_config">
|
||||||
|
<div>
|
||||||
|
<div class="joe_config__aside">
|
||||||
|
<div class="logo">Joe <?php echo _getVersion() ?></div>
|
||||||
|
<ul class="tabs">
|
||||||
|
<li class="item" data-current="joe_notice">最新公告</li>
|
||||||
|
<li class="item" data-current="joe_global">全局设置</li>
|
||||||
|
<li class="item" data-current="joe_image">图片设置</li>
|
||||||
|
<li class="item" data-current="joe_post">文章设置</li>
|
||||||
|
<li class="item" data-current="joe_aside">侧栏设置</li>
|
||||||
|
<li class="item" data-current="joe_index">首页设置</li>
|
||||||
|
<li class="item" data-current="joe_other">其他设置</li>
|
||||||
|
</ul>
|
||||||
|
<?php require_once('core/backup.php'); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="joe_config__notice">请求数据中...</div>
|
||||||
|
<?php
|
||||||
|
$JFavicon = new Typecho_Widget_Helper_Form_Element_Textarea(
|
||||||
|
'JFavicon',
|
||||||
|
NULL,
|
||||||
|
"",
|
||||||
|
'网站 Favicon 设置(非必填)',
|
||||||
|
'介绍:用于设置网站 Favicon,一个好的 Favicon 可以给用户一种很专业的观感 <br />
|
||||||
|
格式:图片 URL地址 或 Base64 地址 <br />
|
||||||
|
其他:免费转换 Favicon 网站 <a target="_blank" href="//tool.lu/favicon">tool.lu/favicon</a>'
|
||||||
|
);
|
||||||
|
$JFavicon->setAttribute('class', 'joe_content joe_image');
|
||||||
|
$form->addInput($JFavicon);
|
||||||
|
} ?>
|
8
index.php
Normal file
8
index.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* “ Eternity is not a distance but a decision - Joe ” <br /> “ 环境要求:PHP 5.4 ~ 7.2 ”
|
||||||
|
* @package Typecho Joe Theme
|
||||||
|
* @author Joe
|
||||||
|
* @link https://ae.js.cn
|
||||||
|
*/
|
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 334 KiB |
Loading…
Reference in New Issue
Block a user