Compare commits

...

8 Commits

Author SHA1 Message Date
MI15\Win
b9eaa4099d v2.1.17-20240730 2024-07-30 17:28:39 +08:00
MI15\Win
d104bf66ce v2.1.16-20240525 2024-05-26 15:04:28 +08:00
MI15\Win
7c1b69b089 v2.1.15-20240513 2024-05-13 16:01:12 +08:00
MI15\Win
2d152489af v2.1.15-20240513 2024-05-13 14:44:55 +08:00
MI15\Win
f77a33581b v2.1.14-20240419 2024-04-19 16:04:17 +08:00
MI15\Win
aca9b6680b v2.1.14-20240416 2024-04-16 18:43:03 +08:00
MI15\Win
1aa4bb0634 v2.1.14-20240414 2024-04-14 15:42:25 +08:00
MI15\Win
fe1244b099 v2.1.13-20240321 2024-03-22 11:07:08 +08:00
45 changed files with 430 additions and 587 deletions

View File

@@ -4,8 +4,8 @@ TwoNav 是一款开源的书签(导航)管理程序,界面简洁,安装
- **仅供体验,定期清理数据** 账号密码`admin`
### 相关文档
* [安装教程](https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7968668&doc_id=3767990) | [使用说明](https://gitee.com/tznb/TwoNav/wikis) | [下载TwoNav](https://gitee.com/tznb/TwoNav/releases)
* [OneNav Extend 升级到 TwoNav](https://gitee.com/tznb/OneNav/wikis/pages?sort_id=7955135&doc_id=2439895)
* [安装教程](https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7968668&doc_id=3767990) | [使用说明](https://gitee.com/tznb/TwoNav/wikis) | [下载TwoNav](https://gitee.com/tznb/TwoNav/releases) | [获取授权](https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7968669&doc_id=3767990)
### 作者声明
* 本程序没有二开版、除了下面的项目地址均为盗版。
@@ -33,6 +33,38 @@ TwoNav 是一款开源的书签(导航)管理程序,界面简洁,安装
* PHP: 7.3 - 8.2
* 数据库: SQLite3 或 MySQL > 5.6.0
### 版本差别
* 免费版无需授权即可使用 / 标准版|高级版需[获取授权](https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7968669&doc_id=3767990)
* 以下是简要的差别对比, 还有很多细节无法全部列举出来
| 功能 | 免费版 | 标准版 | 高级版 |
| ---------------------------- | ---------------- | ---------------- | ---------------------------|
| 多用户支持 | 不支持 | 支持 | 支持 |
| 系统更新 | 不支持 | 一键更新 | 一键更新 |
| 下载主题 | 不支持 | 一键下载 | 一键下载 |
| 链接识别 | 支持单个 | 支持批量 | 支持批量 |
| 链接检测 | 不支持 | 支持 | 支持 |
| 本地备份 | 不支持 | 备份+回滚 | 备份+回滚 |
| 收录管理 | 不支持 | 支持 | 支持 |
| 留言管理 | 不支持 | 支持 | 支持 |
| 文章管理 | 不支持 | 支持 | 支持 |
| 热点新闻 | 不支持 | 支持 | 支持 |
| 账号保留 | 不支持 | 支持 | 支持 |
| 站点地图 | 不支持 | 支持 | 支持 |
| 用户组管理 | 不支持 | 支持 | 支持 |
| 自定义版权 | 不支持 | 支持 | 支持 |
| 自定义代码 | 不支持 | 支持 | 支持 |
| 注册码功能 | 不支持 | 支持 | 支持 |
| 图标获取 | 支持第三方 | 本地获取、第三方获取 | 本地获取、第三方获取 |
| 找回密码 | 不支持 | 不支持 | **支持** |
| 注册验证 | 不支持 | 邮箱 | **邮箱、短信** |
| 第三方登录 | 不支持 | 不支持 | **支持** |
| 短信登录 | 不支持 | 不支持 | **支持** |
| 域名防红 | 不支持 | 不支持 | **支持** |
| 个性域名 | 不支持 | 不支持 | **支持** |
### 功能特色
* 支持后台管理
* 支持私有链接
@@ -48,7 +80,7 @@ TwoNav 是一款开源的书签(导航)管理程序,界面简洁,安装
* 支持uTools插件
* 支持Chromium内核的[浏览器扩展]
* 支持简易文章管理
* 支持更换各种模板/支持混搭,20+个主题模板
* 支持更换各种模板/支持混搭,26个主题模板
* 安全性支持:更换登录入口/二级密码/OTP双重验证

View File

@@ -35,8 +35,8 @@ if($db_config['type'] == 'sqlite'){
$global_config = unserialize( get_db("global_config", "v", ["k" => "o_config"]) ); //全局配置
$c = Get('c');
$libs = $global_config['Libs'];
$layui['js'] = $libs.'/Layui/v2.9.7/layui.js';
$layui['css'] = $libs.'/Layui/v2.9.7/css/layui.css';
$layui['js'] = $libs.'/Layui/v2.9.13/layui.js';
$layui['css'] = $libs.'/Layui/v2.9.13/css/layui.css';
$global_config['static_link'] = isset($global_config['static_link']) ? $global_config['static_link'] : 0;
define('libs',$global_config['Libs']);
define('SysVer',Get_Version());

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 322 KiB

After

Width:  |  Height:  |  Size: 322 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -27,6 +27,13 @@ if($config['switch'] === 1){
exit;
}
$layui_dir = "../static/Layui";
foreach(scandir($layui_dir) as $value) {
if(is_dir($layui_dir . '/' . $value) && preg_match('/^v\d+\.\d+\.\d+$/', $value) && is_file("{$layui_dir}/$value/layui.js")) {
$layui['js'] = "../static/Layui/{$value}/layui.js";
$layui['css'] = "../static/Layui/{$value}/css/layui.css";
}
}
session_name('ATool_SSID');
session_start();
@@ -84,7 +91,7 @@ if(!empty($_GET['type'])){
$user_group['root'] = '站长';
$user_group['default'] = '默认';
foreach ($datas as $key => $data){
$datas[$key]['UserGroupName'] = $user_group[$data['UserGroup']]??'Null';
$datas[$key]['UserGroupName'] = $user_group[$data['UserGroup']]??$data['UserGroup'];
}
}
msgA(['code'=>1,'msg'=>'获取成功','count'=>$count,'data'=>$datas]);
@@ -109,6 +116,10 @@ if(!empty($_GET['type'])){
}elseif($_GET['type'] == 'set_close_Maintenance'){
$global_config['Maintenance'] = 0;
update_db("global_config", ["v" => $global_config], ["k" => "o_config"],[1,'设置成功']);
//开启调试模式
}elseif($_GET['type'] == 'set_open_debug'){
$global_config['Debug'] = 1;
update_db("global_config", ["v" => $global_config], ["k" => "o_config"],[1,'设置成功']);
//重置静态路径
}elseif($_GET['type'] == 'Set_Libs'){
$global_config['Libs'] = "./static";
@@ -120,6 +131,10 @@ if(!empty($_GET['type'])){
opcache_reset(); //清理PHP缓存
}
msgA(['code'=>1,'msg'=>'操作成功']);
//清空统计
}elseif($_GET['type'] == 'del_tongji'){
delete_db('user_count',[]);
msgA(['code'=>1,'msg'=>'操作成功']);
//改账号
}elseif($_GET['type'] == 'set_user_name'){
//新用户名是否合规
@@ -174,6 +189,14 @@ if(!empty($_GET['type'])){
}
$LoginConfig['totp_key'] = '';
update_db("global_user", ["LoginConfig" => $LoginConfig], ["ID" => $_POST['ID']],[1,'操作成功']);
}elseif($_GET['type'] == 'get_pwd2'){
$user_data = get_db('global_user','*',['ID'=>$_POST['ID']]);
$LoginConfig = unserialize($user_data['LoginConfig']);
if(empty($LoginConfig['Password2'])){
msgA(['code'=>-1,'msg'=>'当前账号未设置二级密码']);
}else{
msgA(['code'=>1,'msg'=> "当前账号: {$user_data['User']}<br />二级密码: {$LoginConfig['Password2']}"]);
}
}
msgA(['code'=>-1,'msg'=>'请求类型错误']);
@@ -228,7 +251,7 @@ function echo_Atool(){
<head>
<meta charset="UTF-8">
<title>ATool 工具箱</title>
<link rel="stylesheet" href="../static/Layui/v2.9.7/css/layui.css">
<link rel="stylesheet" href="<?php echo $GLOBALS['layui']['css']; ?>">
<style>
html, body {min-width: 1200px;background-color: #fff;position: relative;}
.page-wrapper {width: 1200px;margin: 0 auto;padding: 0 15px;}
@@ -245,9 +268,11 @@ function echo_Atool(){
<a class="layui-btn layui-btn-sm layui-btn-primary" href="../index.php?c=<?php echo $global_config['Register'];?>" target="_blank"><i class="layui-icon layui-icon-add-1"></i>打开注册页</a>
<button type="set_allow_register" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>允许注册</button>
<button type="set_close_Maintenance" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>关闭维护模式</button>
<button type="set_open_debug" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>打开调试模式</button>
<button type="Set_Libs" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>重置静态路径</button>
<button type="Set_clear_cache" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>清除缓存</button>
<a class="layui-btn layui-btn-sm layui-btn-primary" href="https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7993451&doc_id=3767990" target="_blank"><i class="layui-icon layui-icon-align-left"></i>帮助</a>
<button type="del_tongji" class="del_tongji layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>清空统计</button>
<a class="layui-btn layui-btn-sm layui-btn-primary" href="https://docs.twonav.cn/#/books/start-07" target="_blank"><i class="layui-icon layui-icon-align-left"></i>帮助</a>
</div>
<hr>
<div class="layui-inline layui-form" style="padding-bottom: 5px;">
@@ -274,24 +299,22 @@ function echo_Atool(){
<!-- 表格操作列 -->
<script type="text/html" id="tablebar">
<div class="layui-btn-group">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="set_pwd">改密码</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="set_root">设站长</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="set_user_name">改账号</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del_otp" title="移除OTP登录验证">删OTP</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="more">操作 <i class="layui-icon layui-icon-down"></i></a>
</div>
</script>
<script src="../static/Layui/v2.9.7/layui.js"></script>
<script src="<?php echo $GLOBALS['layui']['js']; ?>"></script>
<script src="../static/jquery/jquery-3.6.0.min.js"></script>
<script src="../static/jquery/jquery.md5.js"></script>
<script src="../templates/admin/js/public.js?v=<?php echo time();?>"></script>
<script>
layui.use(['layer','table'], function () {
layui.use(function () {
var $ = layui.jquery;
var layer = layui.layer;
var table = layui.table;
var dropdown = layui.dropdown;
var cols = [[
{field:'ID',title:'ID',width:60,sort:true}
,{title:'操作',toolbar:'#tablebar',width:220}
,{title:'操作',toolbar:'#tablebar',width:90}
,{field:'User',title:'账号',minWidth:120,templet:function(d){
return '<a style="color:#3c78d8" title="打开用户主页" target="_blank" href="../?u='+d.User+'">'+d.User+'</a>'
}}
@@ -303,6 +326,7 @@ function echo_Atool(){
,{field:'RegTime',title: '注册时间',minWidth:100,templet:function(d){
return d.RegTime == null ? '' : timestampToTime(d.RegTime,true);
}}
]]
//用户表渲染
table.render({
@@ -338,47 +362,67 @@ function echo_Atool(){
table.on('tool(table)', function (obj) {
console.log(obj.data);
var data = obj.data;
if (obj.event == 'set_pwd') {
layer.prompt({formType: 3,value: '',title: '请输入新密码'}, function(value, index, elem){
$.post('./ATool.php?type=set_pwd',{ID:data.ID,new_pwd:$.md5(value)},function(data,status){
if(data.code == 1) {
layer.close(index);
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
if(obj.event == 'more'){
dropdown.render({
elem: this,
show: true,
data: [{
title: '修改密码',
id: 'set_pwd'
},{
title: '设为站长',
id: 'set_root'
},{
title: '修改账号',
id: 'set_user_name'
},{
title: '取消双重验证',
id: 'del_otp'
},{
title: '查看二级密码',
id: 'get_pwd2'
}
});
});
}else if(obj.event == 'set_root'){
$.post('./ATool.php?type=set_root',{ID:data.ID},function(data,status){
if(data.code == 1) {
table.reload('table');
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
}
});
}else if(obj.event == 'set_user_name'){
layer.prompt({formType: 3,value: '',title:'请输入新账号 (原账号:'+data.User+')'}, function(value, index, elem){
$.post('./ATool.php?type=set_user_name',{ID:data.ID,new_user_name:value},function(data,status){
if(data.code == 1) {
layer.close(index);
table.reload('table');
layer.msg(data.msg, {icon: 1});
],
click: function(menu, othis){
if(menu.id == 'set_pwd'){
layer.prompt({formType: 3,value: '',title: '请输入新密码'}, function(value, index, elem){
$.post('./ATool.php?type=set_pwd',{ID:data.ID,new_pwd:$.md5(value)},function(data,status){
if(data.code == 1) {
layer.close(index);
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
}
});
});
}else if(menu.id == 'set_user_name'){
layer.prompt({formType: 3,value: '',title:'请输入新账号 (原账号:'+data.User+')'}, function(value, index, elem){
$.post('./ATool.php?type=set_user_name',{ID:data.ID,new_user_name:value},function(data,status){
if(data.code == 1) {
layer.close(index);
table.reload('table');
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
}
});
});
}else if(menu.id == 'set_root' || menu.id == 'del_otp' || menu.id == 'get_pwd2'){
$.post('./ATool.php?type=' + menu.id,{ID:data.ID},function(data,status){
if(data.code == 1) {
table.reload('table');
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
}
});
}else{
layer.msg(data.msg, {icon: 5});
layer.msg('无效操作', {icon: 5});
}
});
});
}else if(obj.event == 'del_otp'){
$.post('./ATool.php?type=del_otp',{ID:data.ID},function(data,status){
if(data.code == 1) {
layer.msg(data.msg, {icon: 1});
}else{
layer.msg(data.msg, {icon: 5});
}
});
})
}
return false;
});
$('.set').click(function () {
let type = $(this).attr("type");
@@ -391,6 +435,22 @@ function echo_Atool(){
});
return false;
});
//清空统计
$('.del_tongji').on('click', function(){
layer.confirm('确认后将删除所有账号的统计数据(访问统计/点击统计/报表统计),是否继续?',{icon: 3, title:'此操作不可逆'}, function(index){
$.post('./ATool.php?type=del_tongji',function(data,status){
layer.closeLast('loading');
if(data.code == 1){
layer.msg(data.msg,{icon: 1})
} else{
layer.msg(data.msg,{icon: 5});
}
}).fail(function(xhr, textStatus, errorThrown) {
layer.closeLast('loading');
layer.alert('请求失败');
});
});
});
$('#logout').click(function () {
layer.confirm('退出后ATool将被关闭并重置Key',{icon: 3, title:'为了您的站点安全:'}, function(index){
$.post('./ATool.php?type=logout',function(re,status){
@@ -417,7 +477,7 @@ function echo_verify(){ ?>
<head>
<meta charset="UTF-8">
<title>ATool 工具箱</title>
<link rel="stylesheet" href="../static/Layui/v2.9.7/css/layui.css">
<link rel="stylesheet" href="<?php echo $GLOBALS['layui']['css']; ?>">
<link rel="stylesheet" href="../static/Other/login.css">
</head>
<body>
@@ -440,9 +500,9 @@ function echo_verify(){ ?>
</div>
</form>
</div>
</div>
</div>$G
<script src = "../static/jquery/jquery-3.6.0.min.js"></script>
<script src = "../static/Layui/v2.9.7/layui.js"></script>
<script src = "<?php echo $GLOBALS['layui']['js']; ?>"></script>
<script src = '../static/jquery/jquery.md5.js'></script>
<script>
layui.use(['form','jquery'], function () {

View File

@@ -1,18 +0,0 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
// 检测是否已授权
if(is_subscribe('bool')){
//读取授权信息,判断是否存在秘钥
$subscribe = unserialize(get_db('global_config','v',["k" => "s_subscribe"]));
if(!isset($subscribe['public']) || empty($subscribe['public'])){
//尝试从服务器下载秘钥
$Res = ccurl("https://service.twonav.cn/api.php?fn=get_subscribe&order_id={$subscribe['order_id']}&email={$subscribe['email']}&domain={$subscribe['domain']}&mark=20230917",30,true);
$data = json_decode($Res["content"], true);
// 获取成功
if($data["code"] == 200){
$subscribe['public'] = $data['data']['public'];
$subscribe['type'] = $data['data']['type'];
$subscribe['type_name'] = $data['data']['type_name'];
write_global_config('s_subscribe',$subscribe,'订阅信息');
}
}
}

16
system/MySQL/20240720.php Normal file
View File

@@ -0,0 +1,16 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
$sql ='
CREATE INDEX category_idx_1
ON user_categorys (fid, uid, status, property, pid, weight);
CREATE INDEX link_idx_1
ON user_links (uid, fid, status, property, pid, add_time, click);
';
//创建索引用于优化效率
if(exe_sql($sql)){
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
}else{
msg(-1,'数据库更新失败');
}

View File

@@ -49,6 +49,9 @@ INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALU
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230522.php', '1684762253', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230715.php', '1689427853', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230723.php', '1690119053', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20231218.php', '1702828800', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20240328.php', '1711296000', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20240720.php', '1721404800', 'TRUE', '');
-- 创建用户表
DROP TABLE IF EXISTS `global_user`;
@@ -66,6 +69,8 @@ CREATE TABLE IF NOT EXISTS `global_user` (
`Login` varchar(16) NOT NULL COMMENT '登录入口',
`LoginConfig` text NOT NULL COMMENT '登陆配置',
`kct` int(10) UNSIGNED DEFAULT '0' COMMENT 'Key清理时间',
`domain` text NOT NULL COMMENT '个性域名',
`phone` text NOT NULL COMMENT '手机号',
`Extend1` text NOT NULL COMMENT '扩展1',
`Extend2` text NOT NULL COMMENT '扩展2',
PRIMARY KEY (`ID`),
@@ -90,13 +95,15 @@ CREATE TABLE IF NOT EXISTS `user_categorys` (
`description` text NOT NULL DEFAULT '' COMMENT '描述',
`font_icon` text NOT NULL COMMENT '字体图标',
`icon` text NOT NULL DEFAULT '' COMMENT '个性图标',
`category_type` VARCHAR(255) NOT NULL DEFAULT 'link' COMMENT '分类类型',
`max` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '显示数量',
`extend` text NOT NULL COMMENT '扩展',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户分类';
INSERT INTO `user_categorys` (`id`, `cid`, `fid`, `uid`, `pid`, `status`, `property`, `name`, `add_time`, `up_time`, `weight`, `description`, `font_icon`, `icon`, `extend`) VALUES
(1, 1, 0, 0, 0, 1, 0, '默认分类', 1672502400, 1672502400, 0, 'TwoNav默认分类', 'fa fa-book', '', '');
CREATE INDEX category_idx_1 ON user_categorys (fid, uid, status, property, pid, weight);
-- 用户链接表
DROP TABLE IF EXISTS `user_links`;
@@ -127,7 +134,7 @@ INSERT INTO `user_links` (`id`, `lid`, `uid`, `fid`, `pid`, `status`, `property`
(1, 1, 0, 1, 0, 1, 0, 'TwoNav 源码', 'https://gitee.com/tznb/TwoNav', '', 0, '项目开源地址', '', 0, 1672502400, 1672502400, ''),
(2, 2, 0, 1, 0, 1, 0, '使用说明', 'https://gitee.com/tznb/TwoNav/wikis', '', 0, '使用说明', '', 0, 1672502400, 1672502400, '');
CREATE INDEX link_idx_1 ON user_links (uid, fid, status, property, pid, add_time, click);
-- 登录信息表
DROP TABLE IF EXISTS `user_login_info`;
@@ -300,3 +307,21 @@ CREATE TABLE IF NOT EXISTS `user_article_list` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- 第三方用户表
CREATE TABLE IF NOT EXISTS `third_party_user` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT,
`uid` int UNSIGNED NOT NULL COMMENT '用户id',
`inlet` text NOT NULL COMMENT '入口',
`provider` text NOT NULL COMMENT '提供商',
`nickname` text NOT NULL COMMENT '昵称',
`openid` text NOT NULL COMMENT '第三方用户标识',
`access_token` text NOT NULL COMMENT '访问令牌',
`refresh_token` text NOT NULL COMMENT '刷新令牌',
`faceimg` text NOT NULL COMMENT '头像URL',
`bind_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '绑定时间',
`login_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录时间',
`expires` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '到期时间',
`extend` text NOT NULL COMMENT '扩展',
FOREIGN KEY (`uid`) REFERENCES `global_user` (`ID`) ON DELETE CASCADE,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

View File

@@ -47,149 +47,8 @@ if(!preg_match('/^[A-Za-z0-9]{4,13}$/', $user)){
msg(-1,'POST提交的密码异常≠32!');
}elseif(preg_match("/^(system|data|static|templates|index|root|admin)$/i",$user) ) {
msg(-1,'改用户名已被系统保留!');
}elseif(!empty(get_db('global_user','ID',['User'=>$user ]))){
msg(-1,'该账号已被注册!');
}elseif(!empty(get_db('global_user','ID',['Email'=>$Email ]))){
msg(-1,'该邮箱已被使用!');
}elseif(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$Email)){
msg(-1,'邮箱错误!');
}elseif(username_retain_verify($user)){
msg(-1,'该账号已被站长保留!');
}
//插入用户表和创建初始数据库
$RegTime = time();
$PassMD5 = Get_MD5_Password($pass,$RegTime);
$Elogin = Get_Exclusive_Login($user);
//用户组
if(!empty($regcode_info['u_group'])){
$UserGroup = $regcode_info['u_group'];
}elseif(!empty($global_config['default_UserGroup'])){
$UserGroup = $global_config['default_UserGroup'];
}else{
$UserGroup = 'default';
}
//读取用户组信息,如果用户组不存在则设为默认用户组
if(!in_array($UserGroup,['default','root','visitor'])){
$Group = get_db('user_group','*',['code' => $UserGroup]);
if(empty( $Group )){
$UserGroup = 'default';
}
}
$blueprint = !empty(get_db('global_user','ID',['ID'=>$Group['uid']]));
if($blueprint){
$LoginConfig = unserialize(get_db('global_user','LoginConfig',['ID'=>$Group['uid']]));
$LoginConfig['Password2'] = '';
}else{
//不需要修改内容,无需反序化
$LoginConfig = get_db('global_config','v',['k'=>'LoginConfig']);
}
//父ID
if(!empty($regcode_info['user'])){
$FID = get_db('global_user','ID',['User'=>$regcode_info['user']]);
}else{
$FID = 0;
}
insert_db("global_user", [
"FID"=>$FID,
"User"=>$user,
"Password"=>$PassMD5,
"UserGroup"=>$UserGroup,
"Email"=>$Email,
"SecretKey"=>'',
"Token"=>'',
"RegIP"=>$IP,
"RegTime"=>$RegTime,
"Login"=>$Elogin,
"LoginConfig"=>$LoginConfig
]);
//读取用户信息
$USER_DB = get_db("global_user", "*", ["User"=>$user]);
//记录日志
insert_db("user_log", ["uid" => $USER_DB['ID'],"user"=>$USER_DB['User'],"ip"=>$IP,"time"=>time(),"type" => 'register',"content"=>Get_Request_Content(),"description"=>"注册账号"]);
//生成Cookie
Set_key($USER_DB);
//注册码注册时回写数据
if(!empty($regcode_info)){
update_db('regcode_list',['use_time'=>time(),'use_state'=>'已使用,用户名:'.$user],['id'=>$regcode_info['id']]);
}
//写默认站点配置
if($blueprint){
$s_site = get_db('user_config','v',['k'=>'s_site','uid'=>$Group['uid']]);
}else{
$s_site = get_db('global_config','v',['k'=>'s_site']);
}
insert_db("user_config", ["uid"=>$USER_DB['ID'], "k" => "s_site","v" => $s_site,"d" => '站点配置','t'=>'config']);
//写默认模板
if($blueprint){
$global_templates = unserialize(get_db('user_config','v',['k'=>'s_templates','uid'=>$Group['uid']]));
}else{
$global_templates = unserialize(get_db('global_config','v',['k'=>'s_templates']));
}
insert_db("user_config", ["uid" => $USER_DB['ID'],"k"=>"s_templates","v"=>$global_templates,"t"=>"config","d" => '默认模板']);
//写初始分类和链接
$time = time();
if($blueprint){
$categorys = select_db('user_categorys','*',['uid'=>$Group['uid']]);
$links = select_db('user_links','*',['uid'=>$Group['uid']]);
}else{
$categorys = select_db('user_categorys','*',['uid'=>0]);
$links = select_db('user_links','*',['uid'=>0]);
}
foreach ($categorys as $key => $data){
$data['uid'] = $USER_DB['ID'];
$data['add_time'] = $time;
$data['up_time'] = $time;
unset($data['id']);
insert_db('user_categorys',$data);
}
foreach ($links as $key => $data){
$data['uid'] = $USER_DB['ID'];
$data['add_time'] = $time;
$data['up_time'] = $time;
unset($data['id']);
insert_db('user_links',$data);
}
//写初始ID
$link_id = intval(max_db('user_links','lid',['uid'=>$USER_DB['ID']])) +1;
insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"link_id","v"=>$link_id,"t"=>"max_id","d"=>'链接ID']);
$category_id = intval(max_db('user_categorys','cid',['uid'=>$USER_DB['ID']])) +1;
insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"category_id","v"=>$category_id,"t"=>"max_id","d"=>'分类ID']);
insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"pwd_group_id","v"=>1,"t"=>"max_id","d"=>'加密组ID']);
//账号保留
function username_retain_verify($username){
$list = get_db("global_config", "v", ["k" => "username_retain"]);
if(empty($list)){
return false;
}
$patterns = explode("\n", $list);
foreach($patterns as $pattern){
if (preg_match($pattern, $username)) {
return true;
}
}
return false;
}
//返回注册成功
msg(1,'注册成功');
msg(-1,'免费版不支持此功能<br /> <a href="https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7968669&doc_id=3767990" target="_blank" style="color: #1e9fff;">点击此处前往购买页面</a>');

View File

@@ -1,18 +0,0 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
// 检测是否已授权
if(is_subscribe('bool')){
//读取授权信息,判断是否存在秘钥
$subscribe = unserialize(get_db('global_config','v',["k" => "s_subscribe"]));
if(!isset($subscribe['public']) || empty($subscribe['public'])){
//尝试从服务器下载秘钥
$Res = ccurl("https://service.twonav.cn/api.php?fn=get_subscribe&order_id={$subscribe['order_id']}&email={$subscribe['email']}&domain={$subscribe['domain']}&mark=20230917",30,true);
$data = json_decode($Res["content"], true);
// 获取成功
if($data["code"] == 200){
$subscribe['public'] = $data['data']['public'];
$subscribe['type'] = $data['data']['type'];
$subscribe['type_name'] = $data['data']['type_name'];
write_global_config('s_subscribe',$subscribe,'订阅信息');
}
}
}

View File

@@ -0,0 +1,16 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
$sql ='
CREATE INDEX "category_idx_1"
ON "user_categorys" ("fid","uid","status","property","pid","weight");
CREATE INDEX "link_idx_1"
ON "user_links" ("uid","fid","status","property","pid","add_time","click");
';
//创建索引用于优化效率
if(exe_sql($sql)){
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
}else{
msg(-1,'数据库更新失败');
}

View File

@@ -41,7 +41,9 @@ INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALU
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230522.php', '1684762253', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230715.php', '1689427853', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20230723.php', '1690119053', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20231218.php', '1702828800', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20240328.php', '1711296000', 'TRUE', '');
INSERT INTO "updatadb_logs" ("file_name", "update_time", "status", "extra") VALUES ('20240720.php', '1721404800', 'TRUE', '');
-- 创建用户表
CREATE TABLE IF NOT EXISTS "global_user" (
@@ -58,6 +60,8 @@ CREATE TABLE IF NOT EXISTS "global_user" (
"Login" TEXT(16) NOT NULL,
"LoginConfig" TEXT NOT NULL,
"kct" integer(10) DEFAULT 0,
"domain" TEXT NOT NULL DEFAULT "",
"phone" TEXT NOT NULL DEFAULT "",
"Extend1" TEXT NOT NULL DEFAULT "",
"Extend2" TEXT NOT NULL DEFAULT "",
CONSTRAINT "User" UNIQUE ("User" ASC, "Email" ASC)
@@ -79,10 +83,13 @@ CREATE TABLE IF NOT EXISTS "user_categorys" (
"description" TEXT(128) NOT NULL DEFAULT "",
"font_icon" TEXT DEFAULT "",
"icon" TEXT DEFAULT "",
"category_type" TEXT DEFAULT "link",
"max" text DEFAULT "",
"extend" TEXT DEFAULT ""
);
INSERT INTO "user_categorys"("id", "cid", "fid", "uid", "pid", "status", "property", "name", "add_time", "up_time", "weight", "description", "font_icon", "icon", "extend") VALUES (1, 1, 0, 0, 0, 1, 0, '默认分类', 1672502400, 1672502400, 0, 'TwoNav默认分类', 'fa fa-book', '', '');
CREATE INDEX "category_idx_1" ON "user_categorys" ("fid","uid","status","property","pid","weight");
-- 用户链接表
CREATE TABLE IF NOT EXISTS "user_links" (
@@ -107,7 +114,8 @@ CREATE TABLE IF NOT EXISTS "user_links" (
);
INSERT INTO "user_links"("id", "lid", "uid", "fid", "pid", "status", "property", "title", "url", "url_standby", "weight", "description", "icon", "click", "add_time", "up_time", "extend") VALUES (1, 1, 0, 1, 0, 1, 0, 'TwoNav 源码', 'https://gitee.com/tznb/TwoNav', '', 0, '项目开源地址', '', 0, 1672502400, 1672502400, '');
INSERT INTO "user_links"("id", "lid", "uid", "fid", "pid", "status", "property", "title", "url", "url_standby", "weight", "description", "icon", "click", "add_time", "up_time", "extend") VALUES (2, 2, 0, 1, 0, 1, 0, '使用说明', 'https://gitee.com/tznb/TwoNav/wikis', '', 0, '使用说明', '', 0, 1672502400, 1672502400, '');
CREATE INDEX "link_idx_1" ON "user_links" ("uid","fid","status","property","pid","add_time","click");
-- 登录信息表
CREATE TABLE IF NOT EXISTS "user_login_info" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
@@ -263,4 +271,22 @@ CREATE TABLE "user_article_list" (
"cover" TEXT,
"extend" TEXT,
CONSTRAINT "id" UNIQUE ("id" ASC)
);
-- 第三方用户表
CREATE TABLE "third_party_user" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"uid" INTEGER NOT NULL,
"inlet" TEXT NOT NULL DEFAULT "",
"provider" TEXT NOT NULL DEFAULT "",
"nickname" TEXT NOT NULL DEFAULT "",
"openid" TEXT NOT NULL DEFAULT "",
"access_token" TEXT NOT NULL DEFAULT "",
"refresh_token" TEXT NOT NULL DEFAULT "",
"faceimg" TEXT NOT NULL DEFAULT "",
"bind_time" integer NOT NULL DEFAULT 0,
"login_time" integer NOT NULL DEFAULT 0,
"expires" integer NOT NULL DEFAULT 0,
"extend" TEXT NOT NULL DEFAULT "",
CONSTRAINT "uid" FOREIGN KEY ("uid") REFERENCES "global_user" ("ID") ON DELETE CASCADE
);

View File

@@ -288,6 +288,7 @@ function write_category(){
msg(-1,'操作类型错误');
}
//读链接列表
//读链接列表
function read_link_list(){
if($_GET['type'] == 'extend_list'){
@@ -307,7 +308,8 @@ function read_link_list(){
$page = empty(intval($_REQUEST['page'])) ? 1 : intval($_REQUEST['page']);
$limit = empty(intval($_REQUEST['limit'])) ? 50 : intval($_REQUEST['limit']);
$offset = ($page - 1) * $limit; //起始行号
$where = ["uid"=> UID];
$where = ["uid"=> UID,'fid[<=]'=>10000000];
//分类筛选
if(!empty($fid)){
$where['AND']['fid'] = $fid;
@@ -317,6 +319,12 @@ function read_link_list(){
// array_push($category,$fid);
// $where['AND']['fid'] = $category;
// }
}else{
//240405新增: 避免查找全部时将已停用分类下的链接显示出来
$category_where = ['uid'=>UID,'fid'=>0,'status'=>1];
$fid = select_db('user_categorys','cid', $category_where);
$category_where['fid'] = $fid;
$where['AND']['fid'] = array_merge ($fid,select_db('user_categorys','cid',$category_where));
}
//属性筛选
if($_POST['property']==='0' || $_POST['property'] ==='1'){$where['AND']['property'] = ($_POST['property'] == 1?1:0);}
@@ -398,7 +406,11 @@ function write_link(){
$tmp_path = $_SESSION['upload_images'][UID][$_POST['file']];
if(!empty($tmp_path) && is_file($tmp_path)){
$suffix = strtolower(end(explode('.',$tmp_path)));
$path = "./data/user/{$u}/favicon/{$lid}.{$suffix}";
$path = "./data/user/{$u}/favicon";
if(!Check_Path($path)){
msg(-1,'创建目录失败,请检查权限');
}
$path .= "/{$lid}.{$suffix}";
if(rename($tmp_path,$path)) { //移动文件到用户目录
$icon = $path;
}else{
@@ -1076,7 +1088,7 @@ function read_theme(){
//没有缓存 或 禁止缓存 或 缓存过时
if(empty($template) || $_GET['cache'] === 'no' || time() - $data["time"] > 1800 ){
$urls = ["gitee" => "http://tznb.gitee.io/twonav_resource/{$request_dir}_template.json"];
$urls = ["gitee" => "http://gitee.com/tznb/TwoNav_Resource/raw/master/{$request_dir}_template.json"];
$Source = $global_config['Update_Source'] ?? '';
if (!empty($Source) && isset($urls[$Source])) {
$urls = [$Source => $urls[$Source]];
@@ -1431,7 +1443,7 @@ function read_data(){
msg(1,'您已开启离线模式,无法使用该功能!');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_URL, 'https://gitee.com/tznb/TwoNav_Resource/raw/master/connectivity_test.txt');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
@@ -1462,8 +1474,8 @@ function read_data(){
$php_version = floatval(PHP_VERSION);
$log .= "PHP版本{$php_version}\n";
$log .= "Web版本{$_SERVER['SERVER_SOFTWARE']}\n";
if( ( $php_version < 7.3 ) || ( $php_version > 8.2 ) ) {
$log .= "PHP版本不满足要求,支持范围7.3 - 8.2 )\n";
if( $php_version < 7.3 ) {
$log .= "PHP版本不满足要求,要求不低于7.3\n";
}
//获取加载的模块
$ext = get_loaded_extensions();

View File

@@ -296,7 +296,8 @@ function get_a_category(){
//获取TwoNav信息
function app_info(){
$data['php_version'] = floatval(PHP_VERSION);
$data['onenav_version'] = SysVer;
$data['onenav_version'] = 'v0.9.35-20240318'; //模拟版本号用于解决新版插件检测版本>1提示发生异常
$data['twonav_version'] = SysVer;
$data['cat_num'] = count_db('user_categorys',['uid'=>UID])??0;
$data['link_num'] = count_db('user_links',['uid'=>UID])??0;
$data['username'] = U;

View File

@@ -152,8 +152,6 @@ function other_upsys(){
//查找数据库是否已安装更新
if(empty(get_db('updatadb_logs','*',['file_name'=>$file_name]))){
require $filePath; //载入升级脚本
//脚本规范:头部判断是否有DIR常量来避免被直接访问,中间执行升级脚本!底部将执行记录写入数据库!
//insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
}
}
} catch (Exception $e) {
@@ -163,7 +161,6 @@ function other_upsys(){
$updatadb_logs = select_db('updatadb_logs','file_name',['file_name[!]'=>'install.sql']);
$msg .= "当前版本:" . SysVer . "\n";
$msg .= "数据储存:{$GLOBALS['db_config']['type']}\n";
//$msg .= "脚本列表:".(empty($file_list)?'无': "\n".implode("\n",$file_list))."\n" ;
$msg .= "更新记录:".(empty($updatadb_logs)?'无':"\n".implode("\n",$updatadb_logs))."\n";
msg(1,$msg);
}else{
@@ -347,10 +344,7 @@ function write_sys_settings(){
if(!empty($_POST['copyright'])){$o_config['copyright'] = "";$filter = true;}
if(!empty($_POST['global_header'])){$o_config['global_header'] = "";$filter = true;}
if(!empty($_POST['global_footer'])){$o_config['global_footer'] = "";$filter = true;}
if($_POST['apply'] == 1){$o_config['apply'] = 0;$filter = true;}
if($_POST['guestbook'] == 1){$o_config['guestbook'] = 0;$filter = true;}
if($_POST['link_extend'] == 1){$o_config['link_extend'] = 0;$filter = true;}
if($_POST['article'] == 1){$o_config['article'] = 0;$filter = true;}
if($_POST['static_link'] == 1){$o_config['static_link'] = 0;$filter = true;}
}
update_db("global_config", ["v" => $o_config], ["k" => "o_config"],[1,($filter ?"保存成功,未检测到有效授权,带*号的配置无法为你保存":"保存成功")]);
@@ -528,7 +522,7 @@ function other_services(){
if(is_subscribe('bool')){
$Res = ccurl('http://service.twonav.cn/service.php',$overtime,true,data_encryption('get_new_ver',['ver'=>SysVer]));
}else{
$Res = ccurl('http://tznb.gitee.io/twonav_resource/Notice.json',$overtime);
$Res = ccurl('http://gitee.com/tznb/TwoNav_Resource/raw/master/Notice.json',$overtime);
}
$new_data = json_decode($Res['content'], true);
if($new_data["code"] == 200 ){

View File

@@ -4,24 +4,27 @@ if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Fou
//初始化
session_name('TwoNav_initial');
session_start();
$layui['js'] = './static/Layui/v2.9.7/layui.js';
$layui['css'] = './static/Layui/v2.9.7/css/layui.css';
$layui_dir = "./static/Layui";
foreach(scandir($layui_dir) as $value) {
if(is_dir($layui_dir . '/' . $value) && preg_match('/^v\d+\.\d+\.\d+$/', $value) && is_file("{$layui_dir}/$value/layui.js")) {
$layui['js'] = "./static/Layui/{$value}/layui.js";
$layui['css'] = "./static/Layui/{$value}/css/layui.css";
}
}
//判断请求类型
if($_SERVER['REQUEST_METHOD'] === 'POST'){
if(empty($_SESSION['initial'])){ msg(-1,'当前环境无法满足程序运行条件!'); }
define('Debug',TRUE);
$db = null;
$USER_DB =null;
$USER_DB = null;
require DIR.'/system/public.php';
install();
}else{
clearstatcache();//清除缓存
check_env();
$libs = './static'; //使用本地静态库
}
// 环境检查
function check_env() {
if(!empty($_GET['diagnosis'])){
@@ -33,8 +36,8 @@ function check_env() {
$ext = get_loaded_extensions(); //获取组件信息
$php_version = floatval(PHP_VERSION); //获取PHP版本
if( ( $php_version < 7.3 ) || ( $php_version > 8.2 ) ) {
exit("当前PHP版本{$php_version}不满足要求,支持范围7.3 - 8.2");
if($php_version < 7.3 ) {
exit("当前PHP版本{$php_version}不满足要求,要求不低于7.3");
}
//检查是否支持pdo_sqlite
@@ -57,10 +60,10 @@ function diagnosis() {
//检查PHP版本需要大于5.6小于8.0
$php_version = floatval(PHP_VERSION);
$log .= "PHP版本{$php_version}<br />";
$log .= "PHP版本{$php_version} <a href='./?phpinfo=1' style='text-decoration: none;'> 显示phpinfo</a> <br />";
$log .= "Web版本{$_SERVER['SERVER_SOFTWARE']}<br />";
if( ( $php_version < 7.3 ) || ( $php_version > 8.1 ) ) {
$log .= "PHP版本不满足要求,需要7.3 <= PHP <= 8.1 )<br />";
if( $php_version < 7.3) {
$log .= "PHP版本不满足要求,要求不低于7.3<br />";
}
//获取加载的模块
$ext = get_loaded_extensions();
@@ -85,6 +88,7 @@ function diagnosis() {
$log .= in_array("Phar",$ext) ? "Phar支持<br />" : "Phar不支持 (在线更新/主题下载)<br />";
$log .= in_array("hash",$ext) ? "hash支持<br />" : "hash不支持 (书签分享/生成注册码)<br />";
$log .= in_array("session",$ext) ? "session支持<br />" : "session不支持 (影响较大)<br />";
$log .= in_array("intl",$ext) ? "" : "intl不支持 (使用中文域名时可能会导致异常)\n";
$log .= "可用模块:".implode("&#12288;",$ext)."<br />";
exit($log);
}
@@ -266,7 +270,7 @@ function Write_Config(){
$s_site['title'] = '我的书签'; //站点标题
$s_site['subtitle'] = 'TwoNav'; //副标题
$s_site['logo'] = '我的书签'; //站点logo
$s_site['keywords'] = 'TwoNav,开源导航,开源书签,简洁导航,云链接,个人导航,个人书签,扩展,多用户,落幕'; //关键字
$s_site['keywords'] = 'TwoNav,开源导航,开源书签,简洁导航,网址导航,云链接,个人导航,个人书签'; //关键字
$s_site['description'] = 'TwoNav 是一款使用PHP + SQLite3/MySQL 开发的简约导航/书签管理器。'; //描述
$s_site['link_model'] = '302'; //链接模式
$s_site['link_icon'] = '0'; //链接图标
@@ -384,6 +388,9 @@ function Write_Config(){
<div class="login-logo"><h1>TwoNav 安装引导</h1></div>
<div class="layui-col-lg6 layui-col-md-offset3" style ="margin-top:4em;">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-mid layui-word-aux" style="width: 99%;">
<span>禁止用于违法用途、使用者造成的一切法律后果由使用者自行承担、安装视为同意。</span>
</div>
<div class="layui-form-item">
<label class="layui-form-label">管理员账号</i></label>
<div class="layui-input-block">
@@ -407,7 +414,7 @@ function Write_Config(){
<label class="layui-form-label">数据库类型</label>
<div class="layui-input-block">
<select id="db_type" name="db_type" lay-filter="db_type" >
<option value="sqlite" selected="">SQLite ( 推荐 )</option>
<option value="sqlite" selected="">SQLite</option>
<option value="mysql" >MySQL ≥ 5.6.0 </option>
<option value="mariadb" >MariaDB ≥ 10.1 </option>
</select>
@@ -457,15 +464,17 @@ function Write_Config(){
</div>
</div>
<!--MySQL/MariaDB 配置 End-->
<div class="layui-form-mid layui-word-aux">安装方式:全新安装 &ensp;&ensp;&ensp;&ensp;&ensp;</div>
<div class="layui-form-mid layui-word-aux">推荐配置Nginx-1.20 +&ensp;PHP-8.1 </div>
<button class="layui-btn" lay-submit lay-filter="register" style = "width:100%;">开始安装</button>
<div class="layui-form-mid layui-word-aux" style="width: 99%;">
<span>推荐环境Nginx &&ensp;PHP8+ </span>
<a href="./?diagnosis=1" style="float: right;color: #fff;" target="_blank">info</a>
</div>
<button class="layui-btn" lay-submit lay-filter="install" style = "width:100%;">开始安装</button>
</form>
</div>
</div>
</div>
<script src = '<?php echo $libs?>/jquery/jquery-3.6.0.min.js'></script>
<script src = './static/jquery/jquery-3.6.0.min.js'></script>
<script src = '<?php echo $layui['js']; ?>'></script>
<script>
@@ -477,7 +486,7 @@ set_db_type(db_type);
layui.use(['form'], function(){
var form = layui.form;
var install = 0;
//伪静态检测
var request = new XMLHttpRequest();
request.open('GET', './static/Other/login.css?t=' + new Date().getTime(), true);
@@ -498,7 +507,7 @@ layui.use(['form'], function(){
//开始安装
form.on('submit(register)', function(data){
form.on('submit(install)', function(data){
var d = data.field;
if(!/^[A-Za-z0-9]{3,13}$/.test(d.User)){
layer.msg('账号只能是3到13位的数字和字母!', {icon: 5});
@@ -515,20 +524,40 @@ layui.use(['form'], function(){
return false;
}
}
//防止重复安装
if(install > 0){
return false;
}
//安装标记和动态效果
install = 1;
layer.load(1, {shade:[0.5,'#fff']});
layer.msg('正在安装中..', {icon: 16,time: 1000*300});
setTimeout(function() {
if(install == 1){
layer.msg('如果页面长时间无响应,请检查您的运行环境和网络,然后尝试刷新页面再次操作...', {icon: 16,time: 1000*300});
}
}, 6000);
$.post('./index.php?c=install',d,function(Re,status){
if(Re.code == 1){
install = 2;
layer.closeLast('loading');
open_msg(d.User,d.Password);
}else if(Re.code == -2){ //强制安装
layer.confirm(Re.msg,{icon: 3, title:'确定继续 ?'}, function(index){
$.post('./index.php?c=install&f=yes',d,function(Re,status){
layer.closeLast('loading');
if(Re.code == 1){
install = 2;
open_msg(d.User,d.Password);
}else{
install = 0;
layer.msg(Re.msg, {icon: 5,time: 60*1000});
}
});
});
}else{
install = 0;
layer.closeLast('loading');
layer.msg(Re.msg, {icon: 5,time: 60*1000});
}
});

View File

@@ -521,6 +521,9 @@ function Get_IP() {
//获取URL状态码
function get_http_code($url,$TIMEOUT = 10 ,$NOBODY = true) {
if(!preg_match("/^(http:\/\/|https:\/\/).*/",$url)){
return false;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
@@ -535,6 +538,9 @@ function get_http_code($url,$TIMEOUT = 10 ,$NOBODY = true) {
}
function ccurl($url,$overtime = 3,$Referer = false,$post_data = false){
if(!preg_match("/^(http:\/\/|https:\/\/).*/",$url)){
return false;
}
try {
$curl = curl_init ( $url ) ; //初始化
curl_setopt($curl, CURLOPT_TIMEOUT, $overtime ); //超时
@@ -565,6 +571,9 @@ function ccurl($url,$overtime = 3,$Referer = false,$post_data = false){
}
function downFile($url, $file = '', $savePath = './data/temp/',$referer = '',$TIMEOUT = 60,$post_data = false){
if(!preg_match("/^(http:\/\/|https:\/\/).*/",$url)){
return false;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $TIMEOUT); //超时/秒

View File

@@ -1 +1 @@
v2.1.12-20240308
v2.1.17-20240730

View File

@@ -14,7 +14,7 @@
<link rel="stylesheet" href="<?php echo $layui['css'];?>" media="all">
<link rel="stylesheet" href="./templates/admin/css/layuimini.css?v=<?php echo $Ver;?>" media="all">
<link rel="stylesheet" href="./templates/admin/css/themes/default.css?v=<?php echo $Ver;?>" media="all">
<link rel="stylesheet" href="<?php echo $libs?>/Font-awesome/4.7.0/css/font-awesome.css" media="all">
<link rel="stylesheet" href="<?php echo $libs?>/Font-awesome/4.7.0/css/font-awesome.min.css" media="all">
<link rel="shortcut icon" href="<?php echo $favicon;?>">
<style id="layuimini-bg-color"></style>
</head>

View File

@@ -40,7 +40,7 @@ layui.use(['layer','miniTab'], function(){
//获取当前版本
let current_version = $("#ver").text();
let pattern = /\d{8}/;
let pattern = /v(\d+\.\d+\.\d+)/;
current_version = pattern.exec(current_version)[0];
latest_version = pattern.exec(latest_version)[0];

View File

@@ -15,6 +15,5 @@ layui.config({
treetable: 'treetable-lay/treetable', //table树形扩展
tableSelect: 'tableSelect/tableSelect', // table选择扩展
xIcon: 'xIcon/xIcon', //图标选择器
treeSelect: 'treeSelect/treeSelect', // 树形下拉选择器
background: 'background/background' //随机背景图
treeSelect: 'treeSelect/treeSelect'
});

View File

@@ -1,84 +0,0 @@
/**
* 随机背景图
*/
layui.define(['dropdown'], function (exports) {
var background = {
render: function (elem) {
layui.dropdown.render({elem: elem
,data: [{
title: '博天(自适应/动漫)'
,url: 'https://api.btstu.cn/sjbz/api.php?lx=dongman&method=zsy'
,author:'https://api.btstu.cn/doc/sjbz.php'
},{
title: '博天(自适应/妹子)'
,url: 'https://api.btstu.cn/sjbz/api.php?lx=meizi&method=zsy'
,author:'https://api.btstu.cn/doc/sjbz.php'
},{
title: '博天(自适应/风景)'
,url: 'https://api.btstu.cn/sjbz/api.php?lx=fengjing&method=zsy'
,author:'https://api.btstu.cn/doc/sjbz.php'
},{
title: '博天(自适应/随机)'
,url: 'https://api.btstu.cn/sjbz/api.php?lx=suiji&method=zsy'
,author:'https://api.btstu.cn/doc/sjbz.php'
},{
title: '姬长信(PC/每日必应)'
,url: 'https://api.isoyu.com/bing_images.php'
,author:'https://api.isoyu.com'
},{
title: '樱花(PC/动漫)'
,url: 'https://www.dmoe.cc/random.php'
,author:'https://www.dmoe.cc'
},{
title: '梁炯灿(PC/动漫)'
,url: 'https://tuapi.eees.cc/api.php?category=dongman&type=302'
,author:'https://tuapi.eees.cc'
},{
title: '梁炯灿(PC/风景)'
,url: 'https://tuapi.eees.cc/api.php?category=fengjing&type=302'
,author:'https://tuapi.eees.cc'
},{
title: '梁炯灿(PC/必应)'
,url: 'https://tuapi.eees.cc/api.php?category=biying&type=302'
,author:'https://tuapi.eees.cc'
},{
title: '梁炯灿(PC/美女)'
,url: 'https://tuapi.eees.cc/api.php?category=meinv&type=302'
,author:'https://tuapi.eees.cc'
},{
title: '苏晓晴(PC/动漫)'
,url: 'https://acg.toubiec.cn/random.php'
,author:'https://acg.toubiec.cn'
},{
title: '墨天逸(PC/动漫)'
,url: 'https://api.mtyqx.cn/api/random.php'
,author:'https://api.mtyqx.cn/'
},{
title: '小歪(PC/动漫)'
,url: 'https://api.ixiaowai.cn/api/api.php'
,author:'https://api.ixiaowai.cn'
},{
title: '小歪(PC/MC酱)'
,url: 'https://api.ixiaowai.cn/mcapi/mcapi.php'
,author:'https://api.ixiaowai.cn'
},{
title: '小歪(PC/风景)'
,url: 'https://api.ixiaowai.cn/gqapi/gqapi.php'
,author:'https://api.ixiaowai.cn'
},{
title: '保罗(PC/动漫)'
,url: 'https://api.paugram.com/wallpaper/?source=sina'
,author:'https://api.paugram.com/help/wallpaper'
},{
title: '樱道(PC/动漫)'
,url: 'https://api.r10086.com/img-api.php?type=动漫综合1'
,author:'https://img.r10086.com/'
}],click: function(obj){
this.elem.val(obj.url);
},style: 'width: 235px;'
});
}
};
exports("background",background);
});

View File

@@ -22,12 +22,14 @@
<div class="layui-colla-item">
<div class="layui-colla-title">如何使用Chrome浏览器扩展 [非官方]</div>
<div class="layui-colla-content">
前言: 由于浏览器扩展插件非TwoNav所开发适配,如存在Bug或无法使用属正常现象!<br />
安装: 谷歌应用商店下载<a href="https://chrome.google.com/webstore/detail/onenav/omlkjgkogkfpjbdigianpdbjncdchdco?hl=zh-CN&authuser=0" >OneNav</a>并安装 ( 已知0.9.24 - 1.0.1可用,其他版本未知 )<br />
设置S: 1.TwoNav后台>右上角账号>安全设置>API模式>设为<兼容模式> 2.在本页面获取Token<br />
设置C: 插件API设置>填入域名和Token并保存>完成<br />
问题1: 对于单用户使用,确保系统设置中默认用户是当前用户即可!多用户使用时需开启二级域名功能并将域名替换成用户的二级域名,注意结尾不需要带/
问题2: 因为插件非官方开发维护,能用就尽量不要更新,如果插件更新可能会导致无法正常使用,需这个更新获得兼容性!
注意事项: 由于浏览器扩展插件非TwoNav所开发适配,如存在Bug或无法使用属正常现象!<br />
安装扩展: 扩展插件获取:
<a style="color:#3c78d8" href="https://chromewebstore.google.com/detail/onenav/omlkjgkogkfpjbdigianpdbjncdchdco" >Chrome/Edge</a> /
<a style="color:#3c78d8" href="https://addons.mozilla.org/zh-CN/firefox/addon/onenav" >Firefox</a> 下载并安装 ( 已知0.9.24 - 1.1.0可用,其他版本未知 )<br />
后台设置: 1.TwoNav后台>右上角账号>安全设置>API模式>设为<兼容模式> 2.在本页面获取Token<br />
扩展设置: 设置>填入域名和Token并保存即可,注意: 扩展插件中的推荐内容与本程序无关<br />
问题1: 对于单用户使用,确保系统设置中默认用户是当前用户即可!多用户使用时需开启二级域名功能并将域名替换成用户的二级域名,注意结尾不需要带/<br />
问题2: 因为插件非官方开发维护,能用就尽量不要更新,更新后可能会导致无法正常使用!如有发现不兼容我们也会尽快跟进!<br />
问题3: 因为国内环境限制,你可能无法访问谷歌,这种情况你可以在交流群获取插件(安装方法自行百度,部分浏览器可能需要开发者模式加载)
</div>
</div>

View File

@@ -8,6 +8,6 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="referrer" content="no-referrer-when-downgrade">
<?php load_static('css');if($awesome) echo str_replace('#',$libs,' <link rel="stylesheet" href="#/Font-awesome/4.7.0/css/font-awesome.css" media="all">'."\n");?>
<?php load_static('css');if($awesome) echo str_replace('#',$libs,' <link rel="stylesheet" href="#/Font-awesome/4.7.0/css/font-awesome.min.css" media="all">'."\n");?>
<script>var u = "<?php echo U;?>";</script>
</head>

View File

@@ -15,21 +15,21 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-item">
<label class="layui-form-label">账号</label>
<div class="layui-input-inline">
<input type="pass" name="user" lay-verify="required" lay-reqtext="账号不能为空" placeholder='请输入账号' autocomplete="off" class="layui-input">
<input type="pass" name="user" lay-reqtext="账号不能为空" placeholder='请输入账号' autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">邮箱账号,例如: admin@qq.com</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-inline">
<input type="password" name="pwd" lay-verify="required" lay-reqtext="密码不能为空" placeholder='请输入密码或授权码' autocomplete="off" class="layui-input">
<input type="password" name="pwd" lay-reqtext="密码不能为空" placeholder='请输入密码或授权码' autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">邮箱密码,也可能是独立密码或者授权码</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">服务器</label>
<div class="layui-input-inline">
<input type="text" name="host" lay-verify="required" lay-reqtext="服务器不能为空" placeholder='请输入发件服务器地址' autocomplete="off" class="layui-input">
<input type="text" name="host" lay-reqtext="服务器不能为空" placeholder='请输入发件服务器地址' autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">例如: smtp.qq.com</div>
</div>
@@ -37,7 +37,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-item">
<label class="layui-form-label">端口</label>
<div class="layui-input-inline">
<input type="number" name="port" lay-verify="required" lay-reqtext="端口不能为空" placeholder='请输入服务器端口' value="465" autocomplete="off" class="layui-input">
<input type="number" name="port" lay-reqtext="端口不能为空" placeholder='请输入服务器端口' value="465" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">通常是: 465或587</div>
</div>
@@ -56,7 +56,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-item">
<label class="layui-form-label">发送人</label>
<div class="layui-input-inline">
<input type="text" name="sender" lay-verify="required" lay-reqtext="发送人名称不能为空" placeholder='' autocomplete="off" class="layui-input">
<input type="text" name="sender" lay-reqtext="发送人名称不能为空" placeholder='' autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">例如: TwoNav</div>
</div>
@@ -83,7 +83,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-item">
<label class="layui-form-label">发送间隔</label>
<div class="layui-input-inline">
<input type="number" name="send_interval" lay-verify="required" lay-reqtext="发送间隔不能为空" placeholder='IP发送间隔,单位秒!' value="60" autocomplete="off" class="layui-input">
<input type="number" name="send_interval" lay-reqtext="发送间隔不能为空" placeholder='IP发送间隔,单位秒!' value="60" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">为了避免被恶意发送,建议不低于30秒</div>
</div>
@@ -112,37 +112,15 @@ layui.use(['jquery','form'], function () {
var form = layui.form;
var layer = layui.layer;
var $ = layui.jquery;
//表单赋值
form.val('form', <?php echo json_encode(unserialize( get_db("global_config", "v", ["k" => "mail_config"])));?>);
//监听提交
form.on('submit(save)', function (data) {
$.post(get_api('other_root','write_mail_config'),data.field,function(data,status){
if(data.code == 1) {
if(data.msg!="保存成功"){
layer.alert(data.msg)
}else{
layer.msg(data.msg, {icon: 1});
}
}else{
layer.msg(data.msg, {icon: 5});
}
});
layer.msg('当前版本不支持此功能,如需此功能请购买高级版授权', {icon: 5,time: 1000*300});
return false;
});
//测试
form.on('submit(send_test)', function (data) {
layer.load(1, {shade:[0.3,'#fff']});
layer.msg('正在发送中..', {icon: 16,time: 1000*300});
$.post(get_api('other_root','write_mail_test'),data.field,function(data,status){
layer.closeAll();
if(data.code == 1) {
layer.alert(data.msg);
}else{
layer.msg(data.msg, {icon: 5});
}
});
layer.msg('当前版本不支持此功能,如需此功能请购买高级版授权', {icon: 5,time: 1000*300});
return false;
});

View File

@@ -47,7 +47,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">直接访问域名不带任何参数时显示的页面</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label required">默认分组</label>
<div class="layui-input-inline">
<input type="text" name="default_UserGroup" lay-reqtext="默认用户不能为空" placeholder='default' autocomplete="off" class="layui-input">
@@ -55,7 +55,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">用户注册成功后所在分组代号,留空则使用默认分组</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">注册配置</label>
<div class="layui-input-inline" >
<select name="RegOption">
@@ -67,7 +67,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">个人使用时建议禁止注册</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">注册入口</label>
<div class="layui-input-inline">
<input type="text" name="Register" lay-verify="required" lay-reqtext="注册入口不能为空" placeholder='register' autocomplete="off" class="layui-input">
@@ -75,7 +75,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">不想被随意注册时可以修改</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">登录入口</label>
<div class="layui-input-inline">
<input type="text" name="Login" lay-verify="required" lay-reqtext="登录入口不能为空" placeholder='login' autocomplete="off" class="layui-input">
@@ -83,7 +83,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">修改可以防止被爆破,修改请记好入口名,否则无法登录后台</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">静态路径</label>
<div class="layui-input-inline">
<input type="text" name="Libs" lay-verify="required" lay-reqtext="静态路径不能为空,填错会导致无法正常加载网页!默认./static" placeholder='./static' autocomplete="off" class="layui-input">
@@ -99,7 +99,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">主页底部显示的备案信息</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">防XSS脚本</label>
<div class="layui-input-inline" >
<select name="XSS_WAF">
@@ -110,7 +110,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">拦截POST表单中的XSS恶意代码,提升网站安全性</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">防SQL注入</label>
<div class="layui-input-inline" >
<select name="SQL_WAF">
@@ -121,7 +121,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">拦截POST表单中的SQL注入代码,提升网站安全性</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">离线模式</label>
<div class="layui-input-inline" >
<select name="offline">
@@ -140,6 +140,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<option value="1">国内-1</option>
<option value="2">国内-2</option>
<option value="3">海外-3</option>
<option value="4">国内-4</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">默认为自动 (非必要请勿修改)</div>
@@ -164,7 +165,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">开发者调试模式,请不要随意开启</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">维护模式</label>
<div class="layui-input-inline">
<select name="Maintenance">
@@ -175,7 +176,7 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<div class="layui-form-mid layui-word-aux">开启时将关闭主页/登录/注册等服务,站长账号不受影响(网站升级迁移时适用)</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label required">静态链接</label>
<div class="layui-input-inline">
<select name="static_link">

View File

@@ -88,27 +88,18 @@ layui.use(['layer','form','miniTab'], function () {
$("#console_log").text("");
$("#console_log").append("浏览器UA" + navigator.userAgent +"\n");
$("#console_log").append("客户端时间:" + timestampToTime(Math.round(new Date() / 1000) ) +"\n");
var urls = [
['资源节点-码云', 'https://gitee.com/tznb/TwoNav_Resource/raw/master/connectivity_test.txt']
];
urls.forEach(function(route) {
var routeName = route[0];
var url = route[1];
$("#console_log").append("正在检测: " + routeName +"\n");
$.ajax({
url: get_api('read_data', 'connectivity_test'),
type: 'POST',
data: { url: url },
//async: false,
success: function(data, status) {
layer.closeLast('loading');
$("#console_log").append(data.msg + "\n");
},error: function(jqXHR, textStatus, errorThrown) {
layer.closeLast('loading');
$("#console_log").append(routeName + ": 请求 " + url + " 发生错误:" + errorThrown + "\n");
}
});
$("#console_log").append("正在检测: " + 'gitee' +"\n");
$.ajax({
url: get_api('read_data', 'connectivity_test'),
type: 'POST',
data: { id: '1' },
success: function(data, status) {
layer.closeLast('loading');
$("#console_log").append(data.msg + "\n");
},error: function(jqXHR, textStatus, errorThrown) {
layer.closeLast('loading');
$("#console_log").append('gitee' + ": 请求 " + url + " 发生错误:" + errorThrown + "\n");
}
});
});
//phpinfo

View File

@@ -141,7 +141,11 @@ layui.use(['jquery','form'], function () {
$("#order_id").val(data.data.order_id);
$("#end_time").val(timestampToTime(data.data.end_time));
$("#type_name").val(data.data.type_name);
layer.msg(data.msg, {icon: 1,time: 10000});
layer.msg('保存成功,稍后请更新系统..', {icon: 16,shade: [0.1, '#f5f5f5'],scrollbar: false,offset: 'auto',time: 3666,
end: function() {
window.parent.location.href = './?c=admin';
}
});
}else{
layer.alert(data.msg,{icon:5,title:'保存结果',anim: 2,closeBtn: 0,btn: ['我知道了']});
}
@@ -158,53 +162,6 @@ layui.use(['jquery','form'], function () {
return false;
});
//清空订阅信息
form.on('submit(del_key)', function(data){
vcode = randomnum(6);
index = layer.prompt({formType: 0,value: '',title: '请输入验证码: ' + vcode,shadeClose: false,"success":function(){
$("input.layui-layer-input").on('keydown',function(e){
if(e.which == 13) {
del_key(data);
}
});
}},function(){
del_key(data)
});
return false;
});
function del_key(data){
layer.close(index);
if($("input.layui-layer-input").val() != vcode){
layer.msg('验证码错误', {icon: 5});
return false;
}
var order_id = data.field.order_id;
if(order_id.length < 20){
layer.msg('订单号错误,请核对', {icon: 5});
return false;
}
if(data.field.email.length == 0){
layer.msg('邮箱不能为空,请核对', {icon: 5});
return false;
}
layer.load(2, {shade: [0.1,'#fff']});
$.post(get_api('other_services','del_key'),{'order_id':data.field.order_id,'email':data.field.email},function(data,status){
layer.closeAll('loading');
if(data.code == 200) {
$("#order_id").val('');
$("#email").val('');
$("#end_time").val('1970-01-01 08:00:00');
$("#type_name").val('');
layer.msg(data.msg, {icon: 1,time: 10000});
}else{
layer.alert(data.msg,{icon:5,title:'保存结果',anim: 2,closeBtn: 0,btn: ['我知道了']});
}
}).fail(function () {
layer.msg('请求失败', {icon: 5});
});
}
// 正版验证
$('#validate').on('click', function(){
vcode = randomnum(6);

View File

@@ -2,6 +2,68 @@
<body>
<div class="layuimini-container">
<div class="layuimini-main" style=" margin-left: 20px;">
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.1.17-20240730</h4>
<ul>
<li>[升级] Layui组件由2.9.10升级到v2.9.13</li>
<li>[增加] Atool工具箱增加查看二级密码功能</li>
<li>[增加] Atool工具箱增加清空统计数据 ( 指全部账号概要页面的报表统计/访问统计/点击统计 )</li>
<li>[优化] 性能优化 ( 存在数据库更新,建议先备份在升级 )</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.1.16-20240525</h4>
<ul>
<li>[升级] Layui组件由2.9.9升级到2.9.10</li>
<li>[修复] 添加链接时上传图标未自动创建目录</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.1.15-20240513</h4>
<ul>
<li>[修复] 因 Gitee Pages 停止服务导致的相关问题</li>
<li>[升级] Layui组件由2.9.8升级到2.9.9</li>
<li>[变更] 系统设置隐藏部分配置(防止乱搞导致系统异常)</li>
<li>[变更] 保存授权后自动刷新页面并跳转到概要页方便新手用户更新系统</li>
<li>[移除] 自助注册功能</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.1.14-20240416</h4>
<ul>
<li>[修复] 修复已知的安全漏洞提高安全性</li>
<li>[修复] 分类停用时链接列表查找全部时出现已停用分类下的链接</li>
<li>[升级] Layui组件由2.9.7升级到2.9.8</li>
<li>[优化] Docker镜像支持在线下载安装包</li>
<li>[移除] 和风天气插件 ( 因官方停止服务 )</li>
<li>[移除] 随机背景图URL ( 大多数已经无法正常使用了 )</li>
<li>[优化] 安装脚本优化/初始配置优化</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.1.13-20240321</h4>
<ul>
<li>[优化] 兼容OneNav浏览器扩展V1.1.0重构版</li>
<li>[优化] 浏览器插件的相关使用说明 ( 右上角账号>安全设置>获取API )</li>
<li>[优化] 更新检测逻辑由原来判断日期改成判断版本号</li>
<li>[优化] 支持PHP8.3环境下运行</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">

View File

@@ -21,7 +21,6 @@
<ul class="layui-tab-title">
<li class="layui-this">配色</li>
<li>设置</li>
<li>天气</li>
</ul>
<div class="layui-tab-content">
<!--配色Tab-->
@@ -217,57 +216,6 @@
</div>
</div>
<!--天气Tab-->
<div class="layui-tab-item">
<div class="layui-form-item">
<input id="WeatherPosition-input" type="hidden" value="<?php echo $theme_config['WeatherPosition'];?>">
<label class="layui-form-label">插件位置</label>
<div class="layui-input-inline">
<select lay-verify="required" id="WeatherPosition" name="WeatherPosition" lay-search>
<option value="0">关闭</option>
<option value="1">头部工具条</option>
<option value="2">正文右上角</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">插件显示的位置</div>
</div>
<div class="layui-form-item">
<input id="WeatherBackground-input" type="hidden" value="<?php echo $theme_config['WeatherBackground'];?>">
<label class="layui-form-label">天气背景</label>
<div class="layui-input-inline">
<select lay-verify="required" id="WeatherBackground" name="WeatherBackground" lay-search>
<option value="1">随天气变化</option>
<option value="2">浅色</option>
<option value="3">深色</option>
<option value="4">透明</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">天气插件的背景颜色</div>
</div>
<div class="layui-form-item">
<input id="WeatherFontColor-input" type="hidden" value="<?php echo $theme_config['WeatherFontColor'];?>">
<label class="layui-form-label">天气字体色</label>
<div class="layui-input-inline">
<select lay-verify="required" id="WeatherFontColor" name="WeatherFontColor" lay-search>
<option value="1">随头部字体色</option>
<option value="2">随标题字体色</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">天气插件的字体颜色</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">插件Key</label>
<div class="layui-input-inline" style="width: 50%;">
<input type="url" id="WeatherKey" name="WeatherKey" value="<?php echo $theme_config['WeatherKey'];?>" placeholder="" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">
<a target="_blank" style="color:#03a9f4!important;" href='https://widget.qweather.com/create-simple/'>申请Key</a>
</div>
</div>
</div>
<div class="layui-form-item" style="padding-top: 10px;">
<div class="layui-input-block">
@@ -288,7 +236,7 @@ var u = '<?php echo $u?>';
var t = '<?php echo $theme;?>';
var s = '<?php echo $_GET['source'];?>';
var api = get_api('write_theme','config') + '&t=' + t;
layui.use(['form','colorpicker','element','dropdown','background'], function(){
layui.use(['form','colorpicker','element','dropdown'], function(){
var form = layui.form;
var colorpicker = layui.colorpicker;
var dropdown = layui.dropdown;
@@ -327,9 +275,7 @@ dropdown.render({elem: '#CardBackgroundColor-input',data:BackgroundColor ,click:
dropdown.render({elem: '#OtherBackgroundColor-input',data:BackgroundColor ,click: function(obj){this.elem.val(obj.code);},style: 'width: 225px;'});
dropdown.render({elem: '#SidebarBackgroundColor-input',data:BackgroundColor ,click: function(obj){this.elem.val(obj.code);},style: 'width: 225px;'});
//背景图下拉菜单
layui.background.render("input[name='backgroundURL']");
function layeropen(content,url){
layer.open({
type: 1

View File

@@ -2,8 +2,6 @@
$night = $theme_config['night'] == 1 || ( $theme_config['night'] == 2 && (date('G') <= 12 || date('G') >= 19 )) ? 'mdui-theme-layout-dark':'';
$background = $theme_config['backgroundURL'];
$DescrRowNumber = intval($theme_config['DescrRowNumber']);
$WeatherKey = $theme_config['WeatherKey'];
$WeatherPosition = intval(empty($WeatherKey)?"0":$theme_config['WeatherPosition']);
$referrer = $theme_config['referrer'];
$protectA = (($referrer == 'link' || $referrer == 'link_icon') && $site['link_model'] == 'direct') ? 'referrerpolicy="same-origin"':'';
$protectIMG = ($referrer == 'link_icon' || $referrer == 'icon' ) ? 'referrerpolicy="same-origin"':'';
@@ -33,7 +31,7 @@ if ($DescrRowNumber <= 0 ){
<?php if($referrer == 'overall' && $site['link_model'] == 'direct'){echo '<meta name="referrer" content="same-origin">'."\n";}?>
<link rel='stylesheet' href='<?php echo $libs?>/MDUI/v1.0.1/css/mdui.min.css'>
<link rel='stylesheet' href='<?php echo $libs?>/ContextMenu/2.9.2/jquery.contextMenu.min.css'>
<link rel="stylesheet" href="<?php echo $libs?>/Font-awesome/4.7.0/css/font-awesome.css">
<link rel="stylesheet" href="<?php echo $libs?>/Font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="<?php echo $theme_dir?>/static/style<?php echo $theme_config['CardNum'];?>.css?v=<?php echo $theme_ver; ?>">
<link rel="shortcut icon" href="<?php echo $favicon;?>">
<style>
@@ -83,7 +81,6 @@ body{
</div>
</div>
<?php if($WeatherPosition==1){ echo '<div id="he-plugin-simple"></div>';} ?>
<a class = "mdui-hidden-xs mdui-btn mdui-btn-icon" id="config" title = "主题设置" <?php if(!is_login) {echo 'style="display:none;"';}?>><i class="mdui-icon material-icons HFC">&#xe40a;</i></a>
<!-- 新版搜索框END -->
</div>
@@ -163,7 +160,6 @@ body{
<!--左侧抽屉导航END-->
<!--正文内容部分-->
<div class="mdui-container">
<?php if($WeatherPosition==2){ echo '<div style="position:fixed;z-index:1000;right:0px;width:160px;padding-right:0px;"><div id="he-plugin-simple"></div></div>'."\n";} ?>
<div class="mdui-row">
<!-- 遍历分类目录 -->
<?php foreach ( $categorys as $category ) {
@@ -240,41 +236,5 @@ var is_login = <?php echo is_login?'true':'false'; ?>;
<script src = "<?php echo $libs?>/Other/holmes.js"></script>
<script src = "<?php echo $libs; ?>/jquery/jquery.qrcode.min.js"></script>
<script src = "<?php echo $theme_dir?>/static/embed.js?v=<?php echo $theme_ver;?>"></script>
<?php
// 如果Key不为空,则加载天气插件!
if ($WeatherPosition != 0){
$WeatherFontColor = $theme_config['WeatherFontColor'];
if ($WeatherFontColor == 1){
$WeatherFontColor = $theme_config['HeadFontColor'];
}elseif($WeatherFontColor == 2){
$WeatherFontColor = $theme_config['TitleFontColor'];
}
?>
<!--天气插件-->
<script>
WIDGET = {
"CONFIG": {
"modules": "01234", //实况温度、城市、天气状况、预警
"background": "<?php echo $theme_config['WeatherBackground'];?>", //背景颜色
"tmpColor": "<?php echo $WeatherFontColor ?>", //温度文字颜色
"tmpSize": "16",
"cityColor": "<?php echo $WeatherFontColor ?>", //城市名文字颜色
"citySize": "16",
"aqiColor": "<?php echo $WeatherFontColor ?>", //空气质量文字颜色
"aqiSize": "16",
"weatherIconSize": "24", //天气图标尺寸
"alertIconSize": "18", //预警图标尺寸
"padding": "5px 1px 5px 1px", //边距
"borderRadius": "5", //圆角
"key": "<?php echo $WeatherKey;?>"
}
}
</script>
<script src="https://widget.qweather.net/simple/static/js/he-simple-common.js?v=2.0"></script>
<!--天气插件End-->
<?php
}
?>
</body>
</html>

View File

@@ -2,10 +2,9 @@
"name":"默认主题(加强)",
"description":"默认主题(加强)",
"homepage":"https://gitee.com/tznb/TwoNav",
"version":"2.1.0",
"update":"2023/09/28",
"version":"2.1.1",
"update":"2024/04/14",
"author":"落幕",
"screenshot":"https://s3.bmp.ovh/imgs/2022/04/17/8cac968a8cc8135c.png",
"config": {
"HeadBackgroundColor":"#3f51b5",
"SidebarBackgroundColor":"",
@@ -19,12 +18,7 @@
"CardNum":"0",
"backgroundURL":"",
"DescrRowNumber":"2",
"night":"0",
"WeatherBackground":"1",
"WeatherKey":"dd2e9ab2728d4b3c91245fe4057cb9ce",
"WeatherFontColor":"1",
"WeatherPosition":"2",
"ClickLocation":"0"
"night":"0"
},
"support":{
"subitem":0,