Compare commits

..

2 Commits

Author SHA1 Message Date
MI15\Win
a6a3c66278 v2.0.18-20230510 2023-05-10 23:21:46 +08:00
MI15\Win
689dcb2e94 v2.0.17-20230428 2023-04-28 15:45:38 +08:00
22 changed files with 589 additions and 115 deletions

View File

@@ -1,10 +1,8 @@
TwoNav 是一款开源免费的书签(导航)管理程序,使用PHP + SQLite 3开发界面简洁安装简单使用方便。TwoNav可帮助你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。
TwoNav 是一款开源免费的书签导航管理程序界面简洁安装简单使用方便。TwoNav可帮助你将浏览器书签集中式管理解决跨设备、跨平台、跨浏览器之间同步和访问困难问题做到一处部署随处访问。
- **演示站**: [http://two.lm21.top](http://two.lm21.top)
- **仅供体验,定期清理数据** 账号密码`admin`
### 内测版转正
* 删除安装目录下`system`文件夹后在解压覆盖
### 相关文档
* [安装教程](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)
@@ -18,7 +16,12 @@ TwoNav 是一款开源免费的书签导航管理程序使用PHP + SQLi
- QQ: 271152681
- QQ群: 695720839
### 运行环境
* PHP: 7.3 - 8.2
* 数据库: SQLite3 或 MySQL > 5.6.0
### 功能特色
* 支持
* 支持后台管理
* 支持私有链接
* 支持加密链接
@@ -34,4 +37,4 @@ TwoNav 是一款开源免费的书签导航管理程序使用PHP + SQLi
* 支持Chromium内核的[浏览器扩展]
![](https://foruda.gitee.com/images/1680680754989095293/fcc56e76_10359480.jpeg "主页预览")
![](https://foruda.gitee.com/images/1680680836189756220/8c227c34_10359480.jpeg "主题模板")
![](https://foruda.gitee.com/images/1680680836189756220/8c227c34_10359480.jpeg "主题模板")

View File

@@ -119,7 +119,54 @@ if(!empty($_GET['type'])){
opcache_reset(); //清理PHP缓存
}
msgA(['code'=>1,'msg'=>'操作成功']);
//改账号
}elseif($_GET['type'] == 'set_user_name'){
//新用户名是否合规
if(empty($_POST['new_user_name'])){
msgA(['code'=>-1,'msg'=>'用户名不能为空']);
}elseif(empty($_POST['ID'])){
msgA(['code'=>-1,'msg'=>'ID不能为空']);
}elseif(!preg_match('/^[A-Za-z0-9]{4,13}$/',$_POST['new_user_name'])){
msg(-1,'账号只能是4到13位的数字和字母!');
}
//检测是否冲突
if(file_exists(DIR."/data/user/".$_POST['new_user_name'])){
msgA(['code'=>-1,'msg'=>'data/user/存在同名文件夹']);
}
if(file_exists(DIR."/data/backup/".$_POST['new_user_name'])){
msgA(['code'=>-1,'msg'=>'data/backup/存在同名文件夹']);
}
//读取用户信息
$USER = get_db("global_user", "*", ["ID" => $_POST['ID']]);
if(empty($USER)){
msgA(['code'=>-1,'msg'=>'用户ID不存在']);
}elseif($USER['User'] == $_POST['new_user_name']){
msgA(['code'=>-1,'msg'=>'新用户名不能和旧的一样']);
}elseif(has_db('global_user',['User'=>$_POST['new_user_name']])){
msgA(['code'=>-1,'msg'=>'新账号已存在,请核对后再试!']);
}
//移动数据目录
$Path = DIR.'/data/user/'.$USER['User'];
if(is_dir($Path)){
$New_Path = DIR.'/data/user/'.$_POST['new_user_name'];
if(!rename($Path,$New_Path)){
msgA(['code'=>-1,'msg'=>'移动数据目录失败']);
}
}
//移动备份目录
$Path = DIR.'/data/backup/'.$USER['User'];
if(is_dir($Path)){
$New_Path = DIR.'/data/backup/'.$_POST['new_user_name'];
if(!rename($Path,$New_Path)){
msgA(['code'=>-1,'msg'=>'移动备份目录失败']);
}
}
update_db("user_login_info", ["user" => $_POST['new_user_name']], ["user" => $USER['User']]);
update_db("user_log", ["user" => $_POST['new_user_name']], ["user" => $USER['User']]);
update_db("global_user", ["User" => $_POST['new_user_name']], ["ID" => $_POST['ID']],[1,'操作成功']);
}
msgA(['code'=>-1,'msg'=>'请求类型错误']);
}else{
//判断是否已验证
@@ -174,7 +221,7 @@ function echo_Atool(){
<link rel="stylesheet" href="../static/Layui/v2.6.8/css/layui.css">
<style>
html, body {min-width: 1200px;background-color: #fff;position: relative;}
.page-wrapper {width: 900px;margin: 0 auto;padding: 0 15px;}
.page-wrapper {width: 1200px;margin: 0 auto;padding: 0 15px;}
</style>
</head>
<body>
@@ -219,6 +266,7 @@ function echo_Atool(){
<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>
</div>
</script>
<script src="../static/Layui/v2.6.8/layui.js"></script>
@@ -232,7 +280,7 @@ function echo_Atool(){
var table = layui.table;
var cols = [[
{field:'ID',title:'ID',width:60,sort:true}
,{title:'操作',toolbar:'#tablebar',width:130}
,{title:'操作',toolbar:'#tablebar',width:175}
,{field:'User',title:'账号',minWidth:120,templet:function(d){
return '<a style="color:#3c78d8" title="打开用户主页" target="_blank" href="../?u='+d.User+'">'+d.User+'</a>'
}}
@@ -299,6 +347,18 @@ function echo_Atool(){
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});
}else{
layer.msg(data.msg, {icon: 5});
}
});
});
}
});
$('.set').click(function () {

View File

@@ -68,6 +68,49 @@ if(!preg_match('/^[A-Za-z0-9]{4,13}$/', $user)){
msg(-1,'该账号已被站长保留!');
}
//读取邮件配置
$mail_config = get_db("global_config","v",["k"=>"mail_config"]);
if(!empty($mail_config)){
$mail_config = unserialize($mail_config);
if($mail_config['verify_email'] == 1 && $_GET['type'] == 'getcode'){
//判断是否频繁发送
$send_interval = intval($mail_config['send_interval']);
if($send_interval > 0 && has_db('user_log',['type'=>'send_email','ip'=>$IP,'time[>]'=>time() - $send_interval])){
msg(-1,'请勿频繁获取验证码');
}
$mail_config['addressee'] = $_POST['Email'];
$mail_config['Subject'] = '验证码';
$code = mt_rand(100000,999999);
if(!strstr($mail_config['verify_template'],'$code')){
$mail_config['verify_template'] = '您的验证:$code';
}
$mail_config['Body'] = empty($mail_config['verify_template']) ? '您的验证:'.$code:str_replace('$code', $code, $mail_config['verify_template']);
$mail_config['return']='bool';
if(send_email($mail_config)){
session_start();
$_SESSION["{$_POST['Email']}"]['code'] = "$code";
$_SESSION["{$_POST['Email']}"]['time'] = time();
insert_db("user_log", ["uid" => 0,"user"=>$user,"ip"=>$IP,"time"=>time(),"type" => 'send_email',"content"=>Get_Request_Content(),"description"=>"发送注册验证码:".$code.', 接收邮箱: '.$_POST['Email']]);
msg(1,'发送成功');
}else{
msg(-1,'发送失败');
}
exit;
}
}
//验证码效验
if(!empty($mail_config['verify_email']) && $mail_config['verify_email'] == 1){
session_start();
if(empty($_POST['code'])){
msg(-1,'请输入验证码');
}elseif ($_POST['code'] != $_SESSION["{$_POST['Email']}"]['code']) {
msg(-1,'验证码错误'.$_SESSION["{$_POST['Email']}"]['code']);
}elseif($_SESSION["{$_POST['Email']}"]['time'] + 300 < time()){
msg(-1,'验证码已过期');
}
unset($_SESSION["{$_POST['Email']}"]);
}
//插入用户表和创建初始数据库
$RegTime = time();
$PassMD5 = Get_MD5_Password($pass,$RegTime);
@@ -155,28 +198,28 @@ insert_db("user_config", ["uid" => $USER_DB['ID'],"k"=>"s_templates","v"=>$globa
$time = time();
if($blueprint){
$categorys = select_db('user_categorys','*',['uid'=>$Group['uid']]);
$inks = select_db('user_links','*',['uid'=>$Group['uid']]);
$links = select_db('user_links','*',['uid'=>$Group['uid']]);
}else{
$categorys = select_db('user_categorys','*',['uid'=>0]);
$inks = select_db('user_links','*',['uid'=>0]);
$links = select_db('user_links','*',['uid'=>0]);
}
foreach ($categorys as $key => $data){
$categorys[$key]['uid'] = $USER_DB['ID'];
$categorys[$key]['add_time'] = $time;
$categorys[$key]['up_time'] = $time;
unset($categorys[$key]['id']);
$data['uid'] = $USER_DB['ID'];
$data['add_time'] = $time;
$data['up_time'] = $time;
unset($data['id']);
insert_db('user_categorys',$data);
}
insert_db('user_categorys',$categorys);
foreach ($inks as $key => $data){
$inks[$key]['uid'] = $USER_DB['ID'];
$inks[$key]['add_time'] = $time;
$inks[$key]['up_time'] = $time;
unset($inks[$key]['id']);
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);
}
insert_db('user_links',$inks);
//写初始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']);

View File

@@ -44,8 +44,10 @@ if(!is_login()){
}else{
msg(-1,'请先验证二级密码!');
}
//是否加载扩展API
if($global_config['api_extend'] == 1 && is_file('./system/api_extend.php')){
require './system/api_extend.php';
}
//站长相关方法名
$root = ['write_subscribe','write_sys_settings','write_default_settings','read_user_list','write_user_info','read_purview_list','read_users_list','write_users','read_regcode_list','write_regcode','other_upsys','read_log','other_root'];
@@ -157,8 +159,14 @@ function write_category(){
msg(-1,'加密组不存在');
}
//长度检测
if(strlen(htmlspecialchars($_POST['name'],ENT_QUOTES)) > 128 ){
msg(-1,'分类名称长度超限');
}
if(strlen(htmlspecialchars($_POST['description'],ENT_QUOTES)) > 128 ){
msg(-1,'分类描述长度超限');
}
//取最大CID
//$cid = intval(max_db('user_categorys','cid',['uid'=>UID])) +1;
$cid = get_maxid('category_id');
//插入数据库
insert_db('user_categorys',[
@@ -184,17 +192,14 @@ function write_category(){
if($_POST['cid'] == $_POST['fid']){
msg(-1,'父分类不能是自己');
}
//查CID是否存在
if(!get_db('user_categorys','cid',['uid'=>UID ,"cid" => intval($_POST['cid'])])){
msg(-1,'分类不存在');
}
//分类名查重(排除自身)
if(get_db('user_categorys','cid',['uid'=>UID,'cid[!]'=>intval($_POST['cid']),"name" => $_POST['name']])){
msg(-1,'分类名称已存在');
}
//父分类不能是二级分类
if(intval($_POST['fid']) !=0 && get_db('user_categorys','fid',['uid'=>UID ,"cid" => intval($_POST['fid']) ]) !=0 ){
msg(-1,'父分类不能是二级分类');
@@ -203,16 +208,22 @@ function write_category(){
if( $_POST['fid']!=0 && count_db('user_categorys',['uid'=>UID,'fid'=>$_POST['cid']])>0){
msg(-1,'该分类下已存在子分类!');
}
//查父分类是否存在
if( $_POST['fid'] !=0 && !get_db('user_categorys','cid',['uid'=>UID ,"cid" => intval($_POST['fid'])])){
msg(-1,'父分类不存在');
}
//加密组pid是否存在
if(intval($_POST['pwd_id']) !=0 && empty(get_db('user_pwd_group','pid',['uid'=>UID ,"pid" => intval($_POST['pwd_id'])]))){
msg(-1,'加密组不存在');
}
//长度检测
if(strlen(htmlspecialchars($_POST['name'],ENT_QUOTES)) > 128 ){
msg(-1,'分类名称长度超限');
}
if(strlen(htmlspecialchars($_POST['description'],ENT_QUOTES)) > 128 ){
msg(-1,'分类描述长度超限');
}
//更新数据
$data = [
'fid'=>$_POST['fid'],
@@ -361,22 +372,16 @@ function write_link(){
$description = empty($_POST['description']) ? '' : $_POST['description'];
$property = empty($_POST['property']) ? 0 : 1;
//检测链接是否合法
check_link($fid,$title,$url);
check_link($fid,$title,$url,$_POST['url_standby']);
//检查链接是否已存在
if(get_db('user_links','lid',['uid'=>UID ,"url" => $url])){
msg(-1,'链接已存在!');
}
//备用链接检测
if(!empty($_POST['url_standby'])){
foreach ($_POST['url_standby'] as $key => $url_standby){
//尝试匹配Markdown语法的URL,如果没有则认为直接输入
if(preg_match('/\[(.*?)\]\((.*?)\)/', $url_standby, $match)){
check_link($fid,$title,$match[2]);
}else{
check_link($fid,$title,$url_standby);
}
}
//描述长度检测
if(strlen($description) > 128 || strlen(htmlspecialchars($description,ENT_QUOTES)) > 128 ){
msg(-1,'描述长度超限');
}
//取最大链接ID
$lid = get_maxid('link_id');
//图标处理
@@ -524,22 +529,15 @@ function write_link(){
$description = empty($_POST['description']) ? '' : $_POST['description'];
$property = empty($_POST['property']) ? 0 : 1;
//检测链接是否合法
check_link($fid,$title,$url);
//检查链接是否已存在
if(get_db('user_links','lid',['uid'=>UID ,'lid[!]'=>$lid, "url" => $url])){msg(-1,'链接已存在!');}
//检查链接ID是否存在
if(!get_db('user_links','lid',['uid'=>UID ,'lid'=>$lid])){msg(-1,'链接ID不存在!');}
//备用链接检测
if(!empty($_POST['url_standby'])){
foreach ($_POST['url_standby'] as $key => $url_standby){
//尝试匹配Markdown语法的URL,如果没有则认为直接输入
if(preg_match('/\[(.*?)\]\((.*?)\)/', $url_standby, $match)){
check_link($fid,$title,$match[2]);
}else{
check_link($fid,$title,$url_standby);
}
}
check_link($fid,$title,$url,$_POST['url_standby']);
//描述长度检测
if(strlen($description) > 128 || strlen(htmlspecialchars($description,ENT_QUOTES)) > 128 ){
msg(-1,'描述长度超限');
}
//检查链接是否已存在
if(has_db('user_links',['uid'=>UID ,'lid[!]'=>$lid, "url" => $url])){msg(-1,'链接已存在!');}
//检查链接ID是否存在
if(!has_db('user_links',['uid'=>UID ,'lid'=>$lid])){msg(-1,'链接ID不存在!');}
$data = [
'fid' => $fid,
@@ -946,6 +944,7 @@ function write_site_setting(){
'keywords'=>['empty'=>true],
'description'=>['empty'=>true],
'link_model'=>['v'=>['direct','Privacy','Privacy_js','Privacy_meta','301','302','Transition'],'msg'=>'链接模式参数错误'],
'main_link_priority'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'主链优先参数错误'],
'link_icon'=>['int'=>true,'min'=>0,'max'=>10,'msg'=>'链接图标参数错误'],
'site_icon'=>['empty'=>true],
'top_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'热门链接参数错误'],
@@ -1098,6 +1097,9 @@ function other_testing_link(){
global $global_config;
if ( $global_config['offline'] == '1'){ msg(-1,"离线模式无法使用此功能"); }
$code = get_http_code($_POST['url']);
if($code != 200 && $code != 302 && $code != 301){
$code = ccurl($_POST['url'])['code'];
}
msgA(['code' => 0 ,'StatusCode'=> $code]);
}
@@ -1449,8 +1451,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.1 ) ) {
$log .= "PHP版本不满足要求,需要7.3 <= PHP <= 8.1 )\n";
if( ( $php_version < 7.3 ) || ( $php_version > 8.2 ) ) {
$log .= "PHP版本不满足要求,支持范围7.3 - 8.2 )\n";
}
//获取加载的模块
$ext = get_loaded_extensions();

View File

@@ -321,10 +321,25 @@ function write_user_info(){
//删除
case "Del":
$uids = json_decode($_POST['ID']);
$USER_S = select_db('global_user','User',['ID'=>$uids]);
foreach($USER_S as $USER){
if(is_dir(DIR.'/data/user/'.$USER)){
deldir(DIR.'/data/user/'.$USER);
if(is_dir(DIR.'/data/user/'.$USER)){
msg(1,'删除用户数据目录失败,用户名:'.$USER);
}
}
if(is_dir(DIR.'/data/backup/'.$USER)){
deldir(DIR.'/data/backup/'.$USER);
if(is_dir(DIR.'/data/backup/'.$USER)){
msg(1,'删除用户备份目录失败,用户名:'.$USER);
}
}
}
foreach (['regcode_list','user_categorys','user_config','user_count','user_links','user_log','user_login_info'] as $table){
delete_db($table,[ "uid" => $uids ]);
}
delete_db('global_user',["ID" => json_decode($_POST['ID']) ]);
delete_db('global_user',["ID" => $uids]);
msg(1,'删除成功');
break;
//设用户组
@@ -504,6 +519,7 @@ function write_sys_settings(){
'copyright'=>['empty'=>true],
'global_header'=>['empty'=>true],
'global_footer'=>['empty'=>true],
'api_extend'=>['empty'=>true],
//扩展功能-(全局开关)
'apply'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'收录管理参数错误'],
'guestbook'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'留言管理参数错误'],
@@ -609,6 +625,7 @@ function read_log(){
$count = count_db('user_log',$where);
//分页
$where['LIMIT'] = [$offset,$limit];
$where['ORDER']['id'] = 'DESC';
//查询
$datas = select_db('user_log','*',$where);
//返回
@@ -651,6 +668,38 @@ function other_root(){
}
write_global_config('username_retain',$_POST['username_retain'],'账号保留');
msg(1,'保存成功');
}elseif($_GET['type'] == 'write_mail_config'){
if($GLOBALS['global_config']['offline'] == '1'){msg(-1,"离线模式无法使用此功能");}
if(!is_subscribe('bool')){msg(-1,"未检测到有效授权,无法使用该功能!");}
//检测PHPMailer是否存在
clearstatcache();
if(!is_file(DIR.'/system/PHPMailer/PHPMailer.php')){
$filePath = "./data/temp/PHPMailer_6.8.0.tar.gz";
if(downFile('https://update.lm21.top/TwoNav/updata/PHPMailer_6.8.0.tar.gz','PHPMailer_6.8.0.tar.gz','./data/temp/')){
$file_md5 = md5_file($filePath);
if($file_md5 != "07251997fb7ebf3bf2d296d4214ccf0a"){
unlink($filePath);
msg(-1,'效验PHPMailer失败<br/>!');
}
}else{
msg(-1,'下载PHPMailer失败,请重试!<br/>如需手动安装可联系技术支持!');
}
try {
$phar = new PharData($filePath);
$phar->extractTo('./system/', null, true);
unlink($filePath);
clearstatcache();
} catch (Exception $e) {
msg(-1,'安装PHPMailer失败');
}
}
write_global_config('mail_config',$_POST,'账号保留');
msg(1,'保存成功');
}elseif($_GET['type'] == 'write_mail_test'){
$_POST['Subject'] = 'TwoNav 测试邮件' . time();
$_POST['Body'] = '<h1>TwoNav 测试邮件</h1>' . date('Y-m-d H:i:s');
send_email($_POST);
}
}

View File

@@ -131,15 +131,26 @@ if($global_config['link_extend'] == 1 && check_purview('link_extend',1) && in_ar
//如果存在备用链接,则强制载入过渡页
if(!empty($link['url_standby'])) {
$link['url_standby'] = unserialize($link['url_standby']);
require $transit_path;
exit;
//主链优先模式
if($site['main_link_priority'] == 1){
$code = get_http_code($link['url'],3);
if(in_array(intval($code),[200,301,302]) ){
$site['link_model'] = $site['link_model'] == 'direct' ? '302' : $site['link_model'];
}else{
require $transit_path;
exit;
}
}else{
require $transit_path;
exit;
}
}
if ($site['link_model'] == '302'){ //302重定向
if ($site['link_model'] == '302'){ //302重定向(临时)
header("HTTP/1.1 302 Moved Permanently");
header("Location: ".$link['url']);
exit;
}elseif($site['link_model'] == '301'){ //301重定向
}elseif($site['link_model'] == '301'){ //301重定向(永久)
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$link['url']);
exit;

View File

@@ -7,7 +7,7 @@ session_start();
//判断请求类型
if($_SERVER['REQUEST_METHOD'] === 'POST'){
if( !$_SESSION['initial'] ){ msg(-1,'当前环境无法满足程序运行条件!'); }
if(empty($_SESSION['initial'])){ msg(-1,'当前环境无法满足程序运行条件!'); }
define('Debug',TRUE);
$db = null;
$USER_DB =null;
@@ -32,7 +32,7 @@ function check_env() {
$php_version = floatval(PHP_VERSION); //获取PHP版本
if( ( $php_version < 7.3 ) || ( $php_version > 8.2 ) ) {
exit("当前PHP版本{$php_version}不满足要求需要7.3 <= PHP <= 8.2");
exit("当前PHP版本{$php_version}不满足要求,支持范围7.3 - 8.2");
}
//检查是否支持pdo_sqlite
@@ -51,7 +51,7 @@ function diagnosis() {
$log='';
$log .= "服务器时间:" . date("Y-m-d H:i:s") ."<br />";
$log .= "系统信息:" . php_uname('s').','.php_uname('r') ."<br />";
$log .= "当前版本:" . SysVer . "<br />";
$log .= "当前版本:" . file_get_contents('./system/version.txt') . "<br />";
//检查PHP版本需要大于5.6小于8.0
$php_version = floatval(PHP_VERSION);
@@ -76,7 +76,7 @@ function diagnosis() {
if(function_exists("opcache_reset")){
$log = $log ."opcache: 已安装<br />";
}
$log .= "脚本权限:" . get_current_user()."/".substr(sprintf("%o",fileperms("index.php")),-4)."\n";
$log .= "脚本权限:" . get_current_user()."/".substr(sprintf("%o",fileperms("index.php")),-4)."<br />";
$log .= in_array("pdo_sqlite",$ext) ? "PDO_Sqlite支持<br />" : "PDO_Sqlite不支持 (导入db3)<br />";
$log .= in_array("curl",$ext) ? "curl支持<br />" : "curl不支持 (链接识别/在线更新/主题下载/订阅等)<br />";
$log .= in_array("mbstring",$ext) ? "mbstring支持<br />" : "mbstring不支持 (链接识别)<br />";

View File

@@ -233,18 +233,42 @@ function echo_pwds(){
}
}
//检查链接
function check_link($fid,$title,$url,$url_standby=''){
global $db;
function check_link($fid,$title,$url,$url_standby_s=''){
$pattern = "/^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/|sftp:\/\/|magnet:?|ed2k:\/\/|thunder:\/\/|tcp:\/\/|udp:\/\/|rtsp:\/\/).+/";
if (empty($fid)) msg(-1,'分类id(fid)不能为空');
if (empty($title)) msg(-1,'名称不能为空');
if (strlen($title) > 64 ) msg(-1,'名称长度超限');
if (strlen(htmlspecialchars($title,ENT_QUOTES)) > 128 ) msg(-1,'名称长度超限-2');
if (!has_db('user_categorys',['uid'=>UID ,"cid" => $fid])) msg(-1,'分类不存在');
//主链接检测
if (empty($url)) msg(-1,'URL不能为空');
if (!preg_match($pattern,$url)) msg(-1,'URL无效');
if (strlen($url) > 1024 ) msg(-1,'URL长度超限');
if (check_xss($url)) msg(-1,'URL存在非法字符');
//备用链接检测
if(!empty($url_standby_s)){
foreach ($url_standby_s as $key => $url_standby){
//尝试匹配Markdown语法的URL,如果没有则认为直接输入
if(preg_match('/\[(.*?)\]\((.*?)\)/', $url_standby, $match)){
if (empty($match[1])) msg(-1,'备用链接名称不能为空,若不需要名称请直接输入URL');
if (strlen($match[1]) > 64 ) msg(-1,'备用链接名称长度超限');
if (strlen(htmlspecialchars($match[1],ENT_QUOTES)) > 128 ) msg(-1,'备用链接名称长度超限-2');
$url = $match[2];
}else{
$url = $url_standby;
}
if(!preg_match($pattern,$url)){
msg(-1,'备选URL无效');
}elseif(strlen($url) > 1024){
msg(-1,'备选URL长度超限');
}elseif(check_xss($url)){
msg(-1,'备用URL存在非法字符');
}
}
}
if(empty($fid)) {msg(-1007,'分类id(fid)不能为空!');}
if(!get_db('user_categorys','cid',['uid'=>UID ,"cid" => $fid])){msg(-1,'分类不存在');}
if (empty($title)){msg(-1008,'标题不能为空!');}
if (empty($url)){msg(-1009,'URL不能为空');}
if (check_xss($url)){msg(-1010,'URL存在非法字符');}
if (check_xss($url_standby)){msg(-1010,'备用URL存在非法字符');}
if (!preg_match($pattern,$url)){msg(-1010,'URL无效');}
if ( ( !empty($url_standby) ) && ( !preg_match($pattern,$url_standby) ) ) {msg(-1010,'备选URL无效');}
return true;
}
//获取版本号
@@ -473,13 +497,14 @@ function Get_IP() {
}
//获取URL状态码
function get_http_code($url) {
function get_http_code($url,$TIMEOUT = 10) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_TIMEOUT, $TIMEOUT);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36');
$data = curl_exec($curl);
$return = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
@@ -495,6 +520,7 @@ function ccurl($url,$overtime = 3){
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36');
$Res["content"] = curl_exec ( $curl ) ;
$Res["code"] = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close ( $curl ) ;
@@ -636,3 +662,51 @@ function Get_Rand_Str( $length = 8 ,$extend = false){
}
return $str;
}
//发送邮件
function send_email($config){
if(!is_file(DIR.'/system/PHPMailer/PHPMailer.php')){
msg(-1,'未安装PHPMailer!');
}
require DIR.'/system/PHPMailer/Exception.php';
require DIR.'/system/PHPMailer/PHPMailer.php';
require DIR.'/system/PHPMailer/SMTP.php';
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
try {
$mail->CharSet ="UTF-8";
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = $config['host'];
$mail->SMTPAuth = true;
$mail->Username = $config['user'];
$mail->Password = $config['pwd'];
$mail->SMTPSecure = $config['secure'];
$mail->Port = intval($config['port']);
if(preg_match('/(.+)<(.+)>/', $config['sender'], $match)){
$mail->setFrom($match[2],$match[1]);
}else{
$mail->setFrom($config['sender']);
}
$mail->addAddress($config['addressee']); //收件人
$mail->isHTML(true);
$mail->Subject = $config['Subject'];
$mail->Body = $config['Body'];
$mail->send();
if(!empty($config['return']) && $config['return'] == 'bool'){
return true;
}
msg(1,'邮件发送成功');
} catch (Exception $e) {
if(!empty($config['return']) && $config['return'] == 'bool'){
return false;
}
if(Debug){
msgA(['code'=>-1,'msg'=>'发送失败:'.$mail->ErrorInfo]);
}else{
msg(-1,'发送失败');
}
}
}

View File

@@ -51,7 +51,7 @@ if(empty($c) || in_array($c,['index','click'])){
}elseif ($icon ==1){
return('./favicon/index2.php?url='.$link['real_url']);
}elseif($icon ==2){
return('//favicon.rss.ink/v1/'.base64($link['real_url']));
return('//favicon.png.pub/v1/'.base64($link['real_url']));
}elseif($icon ==4){
return('//api.15777.cn/get.php?url='.$link['real_url']);
}elseif($icon ==5){
@@ -69,7 +69,10 @@ if(empty($c) || in_array($c,['index','click'])){
}//如果参数错误则使用本地服务器
}
//取分类图标(六零系主题在用)
function get_category($content){
function get_category($content){ //抽风的命名..过度几个版本后删除
return get_category_icon($content);
}
function get_category_icon($content){
if(empty($content)){
return '';
}

View File

@@ -1 +1 @@
v2.0.16-20230425
v2.0.18-20230510

View File

@@ -19,27 +19,12 @@ layui.use(['form','table','dropdown','miniTab'], function () {
layer.alert("获取分类数据失败,请刷新重试",{icon:5,title:'错误',anim: 2,closeBtn: 0,btn: ['刷新页面']},function () {location.reload();});
return;
}else{
$("#fid").empty();
$("#fid").append('<option value="0" selected="">全部</option>');
$("#fid").append('<optgroup label="用户分类">');
for( key in data.data ){
if(data.data[key].fid == 0){
$("#fid").append("<option value=\""+key+"\">"+data.data[key].name+"</option>");
$("#batch_category_fid").append("<option value=\""+key+"\">"+data.data[key].name+"</option>");
}else{
$("#fid").append("<option value=\""+key+"\">&emsp;"+data.data[key].name+"</option>");
$("#batch_category_fid").append("<option value=\""+key+"\">&emsp;"+data.data[key].name+"</option>");
}
}
$("#fid").append('</optgroup>');
layui.form.render("select");
categorys = data.data;//赋值分类数据
renderTable2();//开始渲染表格
}
});
}
var cols=[[ //表头
{type:'checkbox'} //开启复选框
,{field: 'lid', title: 'ID', width:80, sort: true,hide:false}

View File

@@ -52,13 +52,24 @@
<div class="layui-form-mid layui-word-aux">直连模式无法统计点击数且无法使用备用链接,但它响应最快!</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label" title="存在备用链接并且链接模式为隐私保护或302重定向时生效">主链优先</label>
<div class="layui-input-inline" >
<select name="main_link_priority" >
<option value="0" selected>关闭</option>
<option value="1">开启</option>
</select>
</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" >
<select name="link_icon">
<option value="0" selected>离线图标</option>
<!--<option value="1" >本地服务(支持缓存)</option>-->
<option value="2" >favicon.rss.ink (小图标)</option>
<option value="2" >favicon.png.pub (小图标)</option>
<option value="4" >api.15777.cn</option>
<option value="5" >favicon.cccyun.cc</option>
<option value="6" >api.iowen.cn</option>
@@ -98,11 +109,11 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">输出上限</label>
<label class="layui-form-label">链接数量</label>
<div class="layui-input-inline">
<input type="number" name="max_link" class="layui-input" value="0" placeholder="输入范围: 0-100" lay-verify="required">
</div>
<div class="layui-form-mid layui-word-aux">限制每个分类下显示多少链接,0表示不限制</div>
<div class="layui-form-mid layui-word-aux">限制首页每个分类下显示多少链接,0表示不限制</div>
</div>
<div class="layui-form-item">

View File

@@ -10,6 +10,7 @@
<label class="layui-form-label " style="width:60px;padding-left: 5px;padding-right: 5px;">分类筛选:</label>
<div class="layui-input-inline">
<select id="fid" lay-filter="fid" name="categorys" lay-search>
<?php echo_category(true); ?>
</select>
</div>
</div>
@@ -84,6 +85,7 @@
<label class="layui-form-label">父级分类</label>
<div class="layui-input-block">
<select id="batch_category_fid">
<?php echo_category(true); ?>
</select>
</div>
</div>

View File

@@ -0,0 +1,144 @@
<?php
if($USER_DB['UserGroup'] != 'root'){$content='您没有权限访问此页面'; require(DIR.'/templates/admin/page/404.php');exit;}
$title='系统设置';require(dirname(__DIR__).'/header.php');
?>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<form class="layui-form" lay-filter="form">
<div class="layui-form layuimini-form layui-form-pane">
<blockquote class="layui-elem-quote layui-text" style="">
1.此功能<a href="https://gitee.com/tznb/OneNav/wikis/%E8%AE%A2%E9%98%85%E6%9C%8D%E5%8A%A1%E6%8C%87%E5%BC%95" target="_blank">授权用户</a>专享
</blockquote>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;"><legend>SMTP 配置</legend></fieldset>
<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">
</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">
</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">
</div>
</div>
<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">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">协议</label>
<div class="layui-input-inline" >
<select name="secure">
<option value="ssl" selected="">SSL</option>
<option value="TLS" >TLS</option>
</select>
</div>
</div>
<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">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">收件人</label>
<div class="layui-input-inline">
<input type="text" name="addressee" placeholder='仅用于发件测试' autocomplete="off" class="layui-input">
</div>
</div>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;"><legend>注册参数</legend></fieldset>
<div class="layui-form-item">
<label class="layui-form-label">验证邮箱</label>
<div class="layui-input-inline" >
<select name="verify_email">
<option value="0" selected="">关闭</option>
<option value="1" >开启</option>
</select>
</div>
</div>
<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">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">验证码模板</label>
<div class="layui-input-block">
<textarea name="verify_template" class="layui-textarea" placeholder='您的验证码: $code'></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="send_test">测试</button>
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">确认保存</button>
</div>
</div>
</div>
</form>
</div>
</div>
<?php load_static('js.layui');?>
<script src="./templates/admin/js/public.js?v=<?php echo $Ver;?>"></script>
<script>
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});
}
});
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});
}
});
return false;
});
});
</script>
</body>
</html>

View File

@@ -13,6 +13,7 @@ require(dirname(__DIR__).'/header.php');
<option value="" selected>全部</option>
<option value="login">登录</option>
<option value="register">注册</option>
<option value="send_email">邮件</option>
</select>
</div>
</div>
@@ -57,6 +58,9 @@ layui.use(['table','layer','form'], function () {
//{type:'checkbox'} //开启复选框
{field:'id',title:'ID',width:60}
,{field:'user',title:'账号',width:120,templet:function(d){
if(d.type == 'send_email'){
return d.user;
}
return '<a style="color:#3c78d8" title="用户ID:' + d.uid + ',点击打开用户主页" target="_blank" href="./?u='+d.user+'">'+d.user+'</a>'
}}
,{field:'ip',title:'请求IP',width:140,templet:function(d){

View File

@@ -179,6 +179,16 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
<textarea name="global_footer" class="layui-textarea" placeholder='例如备案号,统计代码等,支持HTML,JS,CSS'></textarea>
</div>
</div>
<div class="layui-form-item" id="api_extend" style="display:none;">
<label class="layui-form-label required">api_extend</label>
<div class="layui-input-inline">
<select name="api_extend">
<option value="0" selected="">关闭</option>
<option value="1" >开启</option>
</select>
</div>
</div>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;"><legend>扩展功能</legend></fieldset>
<blockquote class="layui-elem-quote layui-text" style="">注:开关后请刷新整个页面</blockquote>
@@ -244,6 +254,18 @@ layui.use(['jquery','form'], function () {
});
return false;
});
//开启隐藏功能
$('.layui-elem-field').click(function () {
if(Number( $(this).attr('click')) >= 6){
$("#api_extend").show();
}else{
let click = $(this).attr('click') ? Number($(this).attr('click')) + 1 : 0;
$(this).attr('click',click)
}
});
});
</script>
</body>

View File

@@ -27,7 +27,7 @@ require(dirname(__DIR__).'/header.php');
<button type="button" class="layui-btn" layuimini-content-href="root/sys_log" data-title="系统日志">系统日志</button>
<button type="button" class="layui-btn" layuimini-content-href="updatelog" data-title="更新日志">更新日志</button>
<button type="button" class="layui-btn" layuimini-content-href="root/import_data" data-title="导入数据">导入数据</button>
<button type="button" class="layui-btn" layuimini-content-href="root/mail_set" data-title="邮件配置">邮件配置</button>
</div>
<pre class="layui-code" id="console_log" >
1.功能都集中在上方的按钮了,需要那个就点击那个!

View File

@@ -2,6 +2,34 @@
<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.0.18-20230510</h4>
<ul>
<li>[新增] 限制链接和分类的名称描述长度为128个字符 ( 注:一个汉字≈3个字符,数字/字母=1个字符 )</li>
<li>[新增] 站点设置 > 主链优先 ( 对存在备用链接的书签有效,主链接可用则直接跳转反之进入过渡页,具体用法参照文档 )</li>
<li>[修复] PHP8.2安装时提示不支持 ( 实际支持 )</li>
<li>[优化] 链接列表选择分类时按分类层级显示</li>
<li>[变更] 链接图标域名由favicon.rss.ink更换为favicon.png.pub ( 由xiaoz.me提供 )</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.0.17-20230428</h4>
<ul>
<li>[优化] 删除用户时支持同时删除用户文件夹 ( 图标/留言等数据 ) 和备份数据</li>
<li>[优化] 链接列表 > 检测功能的准确性</li>
<li>[优化] 系统日志按新旧排序,支持记录邮件发送日志</li>
<li>[修复] 用户注册初始数据可能复制失败</li>
<li>[新增] <a href="https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7993451&doc_id=3767990" target="_blank">ATool工具箱</a>支持修改用户名 ( 建议修改前先备份数据 ) </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">

View File

@@ -36,7 +36,7 @@ if ($DescrRowNumber <= 0 ){
<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?>/Layui/v2.6.8/css/layui-icon.css">
<link rel="stylesheet" href="<?php echo $theme_dir?>/static/style<?php echo $theme_config['CardNum'];?>.css?v=<?php echo $version; ?>">
<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>
<?php $SBC = $theme_config['SidebarBackgroundColor']; if( empty($night) ) {?>
@@ -242,7 +242,7 @@ var is_login = <?php echo is_login?'true':'false'; ?>;
<script src = "<?php echo $libs?>/MDUI/v1.0.1/js/mdui.min.js"></script>
<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 $version.time(); ?>"></script>
<script src = "<?php echo $theme_dir?>/static/embed.js?v=<?php echo $theme_ver;?>"></script>
<?php
// 如果Key不为空,则加载天气插件!
if ($WeatherPosition != 0){

View File

@@ -2,8 +2,8 @@
"name":"默认主题(加强)",
"description":"默认主题(加强)",
"homepage":"https://gitee.com/tznb/OneNav",
"version":"2.0.0",
"update":"2023/03/15",
"version":"2.0.1",
"update":"2023/04/25",
"author":"落幕",
"screenshot":"https://s3.bmp.ovh/imgs/2022/04/17/8cac968a8cc8135c.png",
"config": {

View File

@@ -2,7 +2,7 @@
"name": "默认",
"description": "默认",
"homepage": "https://gitee.com/tznb/TwoNav",
"version": "2.0.1",
"update": "2023/04/01",
"version": "2.0.2",
"update": "2023/04/25",
"author": "TwoNav"
}

View File

@@ -1,4 +1,10 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}?>
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
$mail_config = get_db("global_config","v",["k"=>"mail_config"]);
if(!empty($mail_config)){
$mail_config = unserialize($mail_config);
}
?>
<!DOCTYPE html>
<html>
<head>
@@ -33,17 +39,26 @@
<input type="text" name="User" lay-verify="required" placeholder="请输入账号">
</div>
<div class="item">
<span class="icon layui-icon layui-icon-release"></span>
<input type="text" name="Email" lay-verify="required|email" placeholder="请输入邮箱">
</div>
<div class="item">
<span class="icon layui-icon layui-icon-password"></span>
<input type="password" name="Password" lay-verify="required" placeholder="请输入密码">
<span class="bind-password icon icon-4"></span>
</div>
<div class="item">
<span class="icon layui-icon layui-icon-email"></span>
<input type="text" name="Email" lay-verify="required|email" placeholder="请输入邮箱">
</div>
<?php if($mail_config['verify_email'] == 1){ ?>
<div class="item" style="width: 150px;">
<span class="icon layui-icon layui-icon-auz"></span>
<input type="text" name="code" placeholder="请输入验证码">
<div style="display: inline-block;position: absolute;right: 0px;">
<span><a class="layui-btn layui-btn-normal" lay-submit="" lay-filter="getcode" id="getcode">获取验证码</a></span>
</div>
</div>
<?php }?>
<div class="item" <?php echo $global_config['RegOption'] == 2 ?'':'style = "display:none;"'?>>
<span class="icon layui-icon layui-icon-fonts-code"></span>
<input type="text" name="regcode" placeholder="请输入注册码" value="<?php echo $_GET['key'];?>">
@@ -88,8 +103,27 @@
$("input[name='Password']").attr('type', 'text');
}
});
//获取验证码
form.on('submit(getcode)', function (data) {
data = data.field;
data.Password = $.md5(data.Password);
if( /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(data.Email)){
layer.load(1, {shade:[0.3,'#fff']});
layer.msg('正在发送中..', {icon: 16,time: 1000*300});
$.post('./index.php?c=<?php echo $c; ?>&u='+data.User+"&type=getcode",data,function(re,status){
layer.closeAll();
if(re.code == 1) {
layer.msg("发送成功", {icon: 1});
}else{
layer.msg(re.msg, {icon: 5});
}
});
}else{
layer.msg('请输入正确的邮箱', {icon: 5});
}
});
// 进行注册操作
form.on('submit(login)', function (data) {
$("*").blur();
@@ -119,7 +153,6 @@ function Get_Invitation($base64) {
var content =decodeURIComponent(escape(window.atob($base64)));
if (content.substr(0,4) =='http'){
window.open(content);
//window.location.href = content;
}else{
layer.open({title:'获取注册码',content:content});
}