This commit is contained in:
2022-12-24 22:10:40 +08:00
parent 84fc1030a7
commit 2a00928da5
4898 changed files with 429855 additions and 77 deletions
-21
View File
@@ -1,21 +0,0 @@
<?php
namespace app\controller;
include_once base_path().'/vendor/laysense/dns/src/resource/ipv6.php';
use dnstools\ipv6; #用于IPv6相关
class DnsController
{
public function DNS($type,$name,$rip,$id,$query)
{
$ipv6=new IPv6;
$ipv6->ip2bin($ip);
#此处无需修改
$send['id']=$id;
$send['query']=$query;
$return=json_encode($send);
return $return;
}
}
+10 -4
View File
@@ -1,19 +1,25 @@
<?php
namespace app\controller;
use support\Request;
use support\Redis;
use support\View;
class IndexController
{
public function index(Request $request)
{
return response('hello webman');
View::assign('userinfo', $request->session()->get('userinfo'));
return view('index');
}
public function view(Request $request)
public function user(Request $request)
{
return view('index/view', ['name' => 'webman']);
$redis = Redis::connection('default');
$user=$redis->hgetall('User');
View::assign('user', $user);
View::assign('userinfo', $request->session()->get('userinfo'));
return view('user');
}
public function json(Request $request)
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace app\controller;
use support\Request;
use Webman\Captcha\CaptchaBuilder;
use support\View;
use Respect\Validation\Validator as v;
use support\Redis;
use GeoIp2\Database\Reader;
use yzh52521\EasyHttp\Http;
use yzh52521\EasyHttp\Response;
use yzh52521\EasyHttp\RequestException;
class api
{
public function search(Request $request)
{
$content=$request->input('content','0');
$contenttype=v::ip()->validate($content);
if(!$contenttype){
$contenttype=v::domain(false)->validate($content);
if(!$contenttype){
return '请输入合法的IP或域名';
}else{
$contenttype='domain';
$msg['DNS']=dns_get_record("$content",DNS_ANY);
$whois = Http::get('https://api.devopsclub.cn/api/whoisquery?type=json&standard=true', ['domain' => "$content"])->body();
$whois=json_decode($whois);
if($whois->code !=0){
$msg['Whois']='Whois查询失败';
};
if($whois->data->status !=0){
$msg['Whois']='Whois查询出错,请稍后重试';
};
if($whois->data->status ==2 || $whois->data->status ==3 ){
$msg['Whois']='该域名未注册或该后缀暂不支持查询';
};
if($whois->code == 0 && $whois->data->status == 0){
$msg['Whois']=$whois->data->data;
}
$safe = Http::get('https://api.devopsclub.cn/api/dcheck', ['url' => "$content"])->body();
$safe=json_decode($safe);
if($safe->code == 0){
$msg['Safe']='说明:Wx-Safe和QQ-Safe为该域名的微信/QQ红白状态 danger为红 unknown未知(或白) safe安全 仅供参考';
$msg['Wx-Safe']=$safe->data->wx;
$msg['QQ-Safe']=$safe->data->qq;
}
}
}else{
$contenttype='ip';
$msg['Host']=gethostbyaddr("$content");
$reader = new Reader(base_path().'/geoip/GeoLite2-City/GeoLite2-City.mmdb');
$locate=$reader->city($content);
$country=$locate->raw['country']['names']['zh-CN'];
if(array_key_exists("city",$locate->raw)){
$city=$locate->raw['city']['names']['zh-CN'];
}else{
$city=$country;
}
$msg['Location']="$city/$country";
$msg['Network']=$locate->traits->network;
$asnreader= new Reader(base_path().'/geoip/GeoLite2-ASN/GeoLite2-ASN.mmdb');
$asn=$asnreader->Asn("$content");
$asnnumber=$asn->autonomousSystemNumber;
$msg['ASN']="<a href='//whois.ipip.net/AS$asnnumber' target='_ipip'>AS:".$asnnumber.'/'.$asn->autonomousSystemOrganization.'</a>';
}
View::assign('msg', $msg);
return view('print');
}
}
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace app\controller;
use support\Request;
use Webman\Captcha\CaptchaBuilder;
use support\View;
use Respect\Validation\Validator as v;
use support\Redis;
class login
{
public function index(Request $request)
{
$to=$request->get('to', '/');
View::assign('to', $to);
return view('login');
}
public function check(Request $request)
{
$name = $request->post('name','0');
$password = $request->post('password','0');
$usernameValidator = v::StringType()->noWhitespace()->length(1, 15);
try {
$usernameValidator->setName('用户名')->check($name);
} catch (ValidationException $exception) {
return json(['code'=>500, 'msg'=>$e->getMessage()]);
}
try {
$usernameValidator->setName('密码')->check($password);
} catch (ValidationException $exception) {
return json(['code'=>500, 'msg'=>$e->getMessage()]);
}
$redis = Redis::connection('default');
$userinfo=$redis->hget('User',"$name");
if($userinfo===false){
return json(['code'=>501, 'msg'=>'No Such Username']);
}
$realpass=json_decode($userinfo)->passwd;
if(hash("sha256", $password)==$realpass){
$session = $request->session();
$session->set('userinfo', json_decode($userinfo));
$to = $request->post('to','/admin');
return json(['code'=>200, 'msg'=>'Login Successfully']);
}else{
return json(['code'=>502, 'msg'=>'Auth Failed']);
}
return json(['code'=>999, 'msg'=>'Unknown Problem']);
}
}
+22
View File
@@ -0,0 +1,22 @@
<?php
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class Auth implements MiddlewareInterface
{
public function process(Request $request, callable $handler) : Response
{
$session = $request->session();
// 用户未登录
if (!$session->get('userinfo')) {
// 拦截请求,返回一个重定向响应,请求停止向洋葱芯穿越
$to=$request->uri();
return redirect('/login?to='.$to);
}
// 请求继续向洋葱芯穿越
return $handler($request);
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
/**
* 节流设置
* @copyright The PHP-Tools
*/
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
/**
* Class StaticFile
* @package app\middleware
*/
class Throttle implements MiddlewareInterface
{
public function process(Request $request, callable $next):Response
{
if ( $route = $request->route ) {
$params = $route->param();
}
return (new \yzh52521\middleware\Throttle())->handle($request, $next, $params??[]);
}
}
+107
View File
@@ -0,0 +1,107 @@
<!-- Footer -->
<footer class="sticky-footer bg-white">
<div class="container my-auto">
<div class="copyright text-center my-auto">
<span>Made with <a href="https://github.com/startbootstrap/startbootstrap-sb-admin-2/" target="_github">SB Admin 2</a></span><br/>
<span>Powered by <a href="https://www.workerman.net/webman" target="_webman">Webman Framework</a></span><br/>
<span>DNS by <a href="https://laysense.com/dns/webman" target="_webman-dns">Laysense Webman-DNS</a></span><br />
This product includes GeoLite2 data created by MaxMind, available from
<a href="https://www.maxmind.com">https://www.maxmind.com</a>.
<hr/>
<strong class="highspeaker">HighSpeaker(高声语)</strong> DNS Manager System<sup>0.0.1</sup><br/>
<span>&copy; Laysense.com </span>
</div>
</div>
</footer>
<!-- End of Footer -->
</div>
<!-- End of Content Wrapper -->
</div>
<!-- End of Page Wrapper -->
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-angle-up"></i>
</a>
<!-- Logout Modal-->
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">Select "Logout" below if you are ready to end your current session.</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
<a class="btn btn-primary" href="login.html">Logout</a>
</div>
</div>
</div>
</div>
<!-- Search-->
<div class="modal fade" id="Search" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">查询</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" id="SearchNotice">查询中请稍等</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="js/sb-admin-2.min.js"></script>
<script>
function search($search){
var content = $($search).val();
if(content==""){
$('#SearchNotice').html('未输入任何内容');
return false;
}
$.ajax({
type: "POST",
url: '/api/public/search',
data: {'content':content},
async: true,
dataType: 'html',
cache: false,
beforeSend: function () {
$('#SearchNotice').html('正在查询,请稍等(若查询域名将调用外部API耗时较长)');
},
success: function (data) {
$('#SearchNotice').html(data);
},
clearForm: false,
resetForm: false
});
}
</script>
+300
View File
@@ -0,0 +1,300 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<base href="/">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title><?php echo($page_title);?>-HighSpeaker高声语DNS</title>
<link rel="icon" sizes="any" href="logo.png">
<!-- Custom fonts for this template-->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<!-- Custom styles for this template-->
<link href="css/sb-admin-2.min.css" rel="stylesheet">
<style>
@font-face {
font-family: 'HStitle';
src:url(font/HighSpeaker.ttf);
}
@font-face {
font-family: 'HarmonyOS';
src:url(font/HarmonyOSSans-Medium.woff2);
}
.highspeaker {
font-family: 'HStitle';
}
html body {
font-family: 'HarmonyOS';
}
</style>
</head>
<body id="page-top">
<!-- Page Wrapper -->
<div id="wrapper">
<!-- Sidebar -->
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="index.html">
<div class="sidebar-brand-icon">
<img src="logo.png" height="50px"></img>
</div>
<div class="sidebar-brand-text mx-3" style="text-transform:none;"><span class="highspeaker" style="font-size: 13px;background-image: linear-gradient(to right, #43e97b 0%, #38f9d7 100%);-webkit-background-clip: text;color: transparent;">HighSpeaker</span><sup>0.0.1</sup></div>
</a>
<!-- Divider -->
<hr class="sidebar-divider my-0">
<!-- Nav Item - Dashboard -->
<li class="nav-item active">
<a class="nav-link" href="index.html">
<i class="fas fa-fw fa-tachometer-alt"></i>
<span>控制台</span></a>
</li>
<!-- Divider -->
<hr class="sidebar-divider">
<!-- Heading -->
<div class="sidebar-heading">
DNS解析
</div>
<!-- Nav Item - Pages Collapse Menu -->
<li class="nav-item">
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseTwo"
aria-expanded="true" aria-controls="collapseTwo">
<i class="fas fa-fw fa-cog"></i>
<span>Components</span>
</a>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Custom Components:</h6>
<a class="collapse-item" href="buttons.html">Buttons</a>
<a class="collapse-item" href="cards.html">Cards</a>
</div>
</div>
</li>
<!-- Nav Item - Utilities Collapse Menu -->
<li class="nav-item">
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseUtilities"
aria-expanded="true" aria-controls="collapseUtilities">
<i class="fas fa-fw fa-wrench"></i>
<span>Utilities</span>
</a>
<div id="collapseUtilities" class="collapse" aria-labelledby="headingUtilities"
data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<h6 class="collapse-header">Custom Utilities:</h6>
<a class="collapse-item" href="utilities-color.html">Colors</a>
<a class="collapse-item" href="utilities-border.html">Borders</a>
<a class="collapse-item" href="utilities-animation.html">Animations</a>
<a class="collapse-item" href="utilities-other.html">Other</a>
</div>
</div>
</li>
<!-- Divider -->
<hr class="sidebar-divider">
<!-- Heading -->
<div class="sidebar-heading">
系统配置
</div>
<!-- Nav Item - Pages Collapse Menu -->
<li class="nav-item">
<a class="nav-link" href="user" >
<i class="fas fa-fw fa-folder"></i>
<span>账号</span>
</a>
</li>
<!-- Nav Item - Charts -->
<li class="nav-item">
<a class="nav-link" href="charts.html">
<i class="fas fa-fw fa-chart-area"></i>
<span>设置</span></a>
</li>
<!-- Nav Item - Tables -->
<li class="nav-item">
<a class="nav-link" href="tables.html">
<i class="fas fa-fw fa-table"></i>
<span>关于</span></a>
</li>
<!-- Divider -->
<hr class="sidebar-divider d-none d-md-block">
<!-- Sidebar Toggler (Sidebar) -->
<div class="text-center d-none d-md-inline">
<button class="rounded-circle border-0" id="sidebarToggle"></button>
</div>
<!-- Sidebar Message -->
<div class="sidebar-card d-none d-lg-flex">
<img class="sidebar-card-illustration mb-2" src="img/undraw_rocket.svg" alt="...">
<p class="text-center mb-2"><strong class="highspeaker">HighSpeaker</strong><strong> Pro</strong> 可提供多用户的权威DNS管理</p>
<a class="btn btn-success btn-sm" href="https://startbootstrap.com/theme/sb-admin-pro"><span class="highspeaker">HighSpeaker</span> Pro!</a>
</div>
</ul>
<!-- End of Sidebar -->
<!-- Content Wrapper -->
<div id="content-wrapper" class="d-flex flex-column">
<!-- Main Content -->
<div id="content">
<!-- Topbar -->
<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow">
<!-- Sidebar Toggle (Topbar) -->
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
<i class="fa fa-bars"></i>
</button>
<!-- Topbar Search -->
<form
class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search">
<div class="input-group">
<input id="search1" type="text" class="form-control bg-light border-0 small" placeholder="输入域名或IP进行查询"
aria-label="Search" aria-describedby="basic-addon2">
<div class="input-group-append">
<button onclick="search('#search1');" class="btn btn-primary" type="button" data-toggle="modal" data-target="#Search">
<i class="fas fa-search fa-sm"></i>
</button>
</div>
</div>
</form>
<!-- Topbar Navbar -->
<ul class="navbar-nav ml-auto">
<!-- Nav Item - Search Dropdown (Visible Only XS) -->
<li class="nav-item dropdown no-arrow d-sm-none">
<a class="nav-link dropdown-toggle" href="#" id="searchDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-search fa-fw"></i>
</a>
<!-- Dropdown - Messages -->
<div class="dropdown-menu dropdown-menu-right p-3 shadow animated--grow-in"
aria-labelledby="searchDropdown">
<form class="form-inline mr-auto w-100 navbar-search">
<div class="input-group">
<input id="search2" type="text" class="form-control bg-light border-0 small"
placeholder="输入域名或IP进行查询" aria-label="Search"
aria-describedby="basic-addon2">
<div class="input-group-append">
<button onclick="search('#search2');" class="btn btn-primary" type="button" data-toggle="modal" data-target="#Search">
<i class="fas fa-search fa-sm"></i>
</button>
</div>
</div>
</form>
</div>
</li>
<!-- Nav Item - Alerts -->
<li class="nav-item dropdown no-arrow mx-1">
<a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-bell fa-fw"></i>
<!-- Counter - Alerts -->
<span class="badge badge-danger badge-counter">3+</span>
</a>
<!-- Dropdown - Alerts -->
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="alertsDropdown">
<h6 class="dropdown-header">
Alerts Center
</h6>
<a class="dropdown-item d-flex align-items-center" href="#">
<div class="mr-3">
<div class="icon-circle bg-primary">
<i class="fas fa-file-alt text-white"></i>
</div>
</div>
<div>
<div class="small text-gray-500">December 12, 2019</div>
<span class="font-weight-bold">A new monthly report is ready to download!</span>
</div>
</a>
<a class="dropdown-item d-flex align-items-center" href="#">
<div class="mr-3">
<div class="icon-circle bg-success">
<i class="fas fa-donate text-white"></i>
</div>
</div>
<div>
<div class="small text-gray-500">December 7, 2019</div>
$290.29 has been deposited into your account!
</div>
</a>
<a class="dropdown-item d-flex align-items-center" href="#">
<div class="mr-3">
<div class="icon-circle bg-warning">
<i class="fas fa-exclamation-triangle text-white"></i>
</div>
</div>
<div>
<div class="small text-gray-500">December 2, 2019</div>
Spending Alert: We've noticed unusually high spending for your account.
</div>
</a>
<a class="dropdown-item text-center small text-gray-500" href="#">Show All Alerts</a>
</div>
</li>
<!-- Nav Item - User Information -->
<li class="nav-item dropdown no-arrow">
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mr-2 d-none d-lg-inline text-gray-600 small"><?php echo($userinfo->name);?></span>
<img class="img-profile rounded-circle"
src="<?php echo('https://cravatar.cn/avatar/' . md5(strtolower(trim( $userinfo->email ))));?>">
</a>
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="userDropdown">
<a class="dropdown-item" href="#">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
Profile
</a>
<a class="dropdown-item" href="#">
<i class="fas fa-cogs fa-sm fa-fw mr-2 text-gray-400"></i>
Settings
</a>
<a class="dropdown-item" href="#">
<i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i>
Activity Log
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#logoutModal">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
Logout
</a>
</div>
</li>
</ul>
</nav>
<!-- End of Topbar -->
+347
View File
@@ -0,0 +1,347 @@
<?php
$page_title='控制台';
include('common_head.html');?>
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800">控制台Dashboard</h1>
<a href="#" class="d-none d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i
class="fas fa-download fa-sm text-white-50"></i> Generate Report</a>
</div>
<small>为保证性能,统计数据更新具有延迟</small><br />
<!-- Content Row -->
<div class="row">
<!-- Earnings (Monthly) Card Example -->
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-primary shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
总解析量</div>
<div class="h5 mb-0 font-weight-bold text-gray-800">140000</div>
</div>
<div class="col-auto">
<i class="fas fa-calendar fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Earnings (Monthly) Card Example -->
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-success shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
Earnings (Annual)</div>
<div class="h5 mb-0 font-weight-bold text-gray-800">$215,000</div>
</div>
<div class="col-auto">
<i class="fas fa-dollar-sign fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Earnings (Monthly) Card Example -->
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-info shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">Tasks
</div>
<div class="row no-gutters align-items-center">
<div class="col-auto">
<div class="h5 mb-0 mr-3 font-weight-bold text-gray-800">50%</div>
</div>
<div class="col">
<div class="progress progress-sm mr-2">
<div class="progress-bar bg-info" role="progressbar"
style="width: 50%" aria-valuenow="50" aria-valuemin="0"
aria-valuemax="100"></div>
</div>
</div>
</div>
</div>
<div class="col-auto">
<i class="fas fa-clipboard-list fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
<!-- Pending Requests Card Example -->
<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-warning shadow h-100 py-2">
<div class="card-body">
<div class="row no-gutters align-items-center">
<div class="col mr-2">
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
Pending Requests</div>
<div class="h5 mb-0 font-weight-bold text-gray-800">18</div>
</div>
<div class="col-auto">
<i class="fas fa-comments fa-2x text-gray-300"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Content Row -->
<div class="row">
<!-- Area Chart -->
<div class="col-xl-8 col-lg-7">
<div class="card shadow mb-4">
<!-- Card Header - Dropdown -->
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Earnings Overview</h6>
<div class="dropdown no-arrow">
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in"
aria-labelledby="dropdownMenuLink">
<div class="dropdown-header">Dropdown Header:</div>
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="chart-area">
<canvas id="myAreaChart"></canvas>
</div>
</div>
</div>
</div>
<!-- Pie Chart -->
<div class="col-xl-4 col-lg-5">
<div class="card shadow mb-4">
<!-- Card Header - Dropdown -->
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Revenue Sources</h6>
<div class="dropdown no-arrow">
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in"
aria-labelledby="dropdownMenuLink">
<div class="dropdown-header">Dropdown Header:</div>
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="chart-pie pt-4 pb-2">
<canvas id="myPieChart"></canvas>
</div>
<div class="mt-4 text-center small">
<span class="mr-2">
<i class="fas fa-circle text-primary"></i> Direct
</span>
<span class="mr-2">
<i class="fas fa-circle text-success"></i> Social
</span>
<span class="mr-2">
<i class="fas fa-circle text-info"></i> Referral
</span>
</div>
</div>
</div>
</div>
</div>
<!-- Content Row -->
<div class="row">
<!-- Content Column -->
<div class="col-lg-6 mb-4">
<!-- Project Card Example -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Projects</h6>
</div>
<div class="card-body">
<h4 class="small font-weight-bold">Server Migration <span
class="float-right">20%</span></h4>
<div class="progress mb-4">
<div class="progress-bar bg-danger" role="progressbar" style="width: 20%"
aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<h4 class="small font-weight-bold">Sales Tracking <span
class="float-right">40%</span></h4>
<div class="progress mb-4">
<div class="progress-bar bg-warning" role="progressbar" style="width: 40%"
aria-valuenow="40" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<h4 class="small font-weight-bold">Customer Database <span
class="float-right">60%</span></h4>
<div class="progress mb-4">
<div class="progress-bar" role="progressbar" style="width: 60%"
aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<h4 class="small font-weight-bold">Payout Details <span
class="float-right">80%</span></h4>
<div class="progress mb-4">
<div class="progress-bar bg-info" role="progressbar" style="width: 80%"
aria-valuenow="80" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<h4 class="small font-weight-bold">Account Setup <span
class="float-right">Complete!</span></h4>
<div class="progress">
<div class="progress-bar bg-success" role="progressbar" style="width: 100%"
aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</div>
<!-- Color System -->
<div class="row">
<div class="col-lg-6 mb-4">
<div class="card bg-primary text-white shadow">
<div class="card-body">
Primary
<div class="text-white-50 small">#4e73df</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-success text-white shadow">
<div class="card-body">
Success
<div class="text-white-50 small">#1cc88a</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-info text-white shadow">
<div class="card-body">
Info
<div class="text-white-50 small">#36b9cc</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-warning text-white shadow">
<div class="card-body">
Warning
<div class="text-white-50 small">#f6c23e</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-danger text-white shadow">
<div class="card-body">
Danger
<div class="text-white-50 small">#e74a3b</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-secondary text-white shadow">
<div class="card-body">
Secondary
<div class="text-white-50 small">#858796</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-light text-black shadow">
<div class="card-body">
Light
<div class="text-black-50 small">#f8f9fc</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<div class="card bg-dark text-white shadow">
<div class="card-body">
Dark
<div class="text-white-50 small">#5a5c69</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-6 mb-4">
<!-- Illustrations -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Illustrations</h6>
</div>
<div class="card-body">
<div class="text-center">
<img class="img-fluid px-3 px-sm-4 mt-3 mb-4" style="width: 25rem;"
src="img/undraw_posting_photo.svg" alt="...">
</div>
<p>Add some quality, svg illustrations to your project courtesy of <a
target="_blank" rel="nofollow" href="https://undraw.co/">unDraw</a>, a
constantly updated collection of beautiful svg images that you can use
completely free and without attribution!</p>
<a target="_blank" rel="nofollow" href="https://undraw.co/">Browse Illustrations on
unDraw &rarr;</a>
</div>
</div>
<!-- Approach -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Development Approach</h6>
</div>
<div class="card-body">
<p>SB Admin 2 makes extensive use of Bootstrap 4 utility classes in order to reduce
CSS bloat and poor page performance. Custom CSS classes are used to create
custom components and custom utility classes.</p>
<p class="mb-0">Before working with this theme, you should become familiar with the
Bootstrap framework, especially the utility classes.</p>
</div>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
<?php include('common_foot.html');?>
<!-- Page level plugins -->
<script src="vendor/chart.js/Chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="js/demo/chart-area-demo.js"></script>
<script src="js/demo/chart-pie-demo.js"></script>
</body>
</html>
-14
View File
@@ -1,14 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="/favicon.ico"/>
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
+138
View File
@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>登录-HighSpeaker高声语DNS</title>
<!-- Custom fonts for this template-->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<!-- Custom styles for this template-->
<link href="css/sb-admin-2.min.css" rel="stylesheet">
<style>
@font-face {
font-family: 'HStitle';
src:url(font/HighSpeaker.ttf);
}
@font-face {
font-family: 'HarmonyOS';
src:url(font/HarmonyOSSans-Medium.woff2);
}
.highspeaker {
font-family: 'HStitle';
}
html body {
font-family: 'HarmonyOS';
}
</style>
</head>
<body class="bg-gradient-primary">
<div class="container">
<!-- Outer Row -->
<div class="row justify-content-center">
<div class="col-xl-10 col-lg-12 col-md-9">
<div class="card o-hidden border-0 shadow-lg my-5">
<div class="card-body p-0">
<!-- Nested Row within Card Body -->
<div class="row">
<div class="col-lg-6 d-none d-lg-block" style=" background: url(logo.png);background-position: center;background-size: 125px 125px;background-repeat:no-repeat;"></div>
<div class="col-lg-6">
<div class="p-5">
<div class="text-center">
<h1 class="h4 mb-4 highspeaker" style="background-image: linear-gradient(to right, #43e97b 0%, #38f9d7 100%);-webkit-background-clip: text;color: transparent;">HighSpeaker 高声语</h1>
<h5>DNS管理系统-登录</h5>
</div>
<form class="user">
<div class="form-group">
<input id="name" type="text" class="form-control form-control-user"
placeholder="(Account Only)">
</div>
<div class="form-group">
<input type="password" class="form-control form-control-user"
id="password" placeholder="Password">
</div>
<a href="javascript:login()" class="btn btn-primary btn-user btn-block">
Login
</a>
<strong id="notice"></strong>
</form>
<hr>
<div class="text-center">
<a class="small" href="//laysense.com/dns" target="_lsblank">&copy; Laysense.com</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="js/sb-admin-2.min.js"></script>
<script>
function login(){
var goto = "<?php echo($to);?>";
var name = $("#name").val();
var password = $("#password").val();
if(name=="" || password==""){
$('#notice').html('不能为空');
return false;
}
$.ajax({
type: "POST",
url: '/login/check',
data: {'name':name,'password':password},
async: false,
dataType: 'json',
cache: false,
beforeSubmit: function () {
$('#notice').html('正在登录');
},
success: function (data) {
if (data.code == 200) {
$('#notice').html('操作成功,即将刷新页面');
$(location).attr('href',goto);
} else {
$('#notice').html(data.msg);
}
},
clearForm: false,
resetForm: false
});
}
</script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
<pre><?php print_r($msg); ?></pre>
+134
View File
@@ -0,0 +1,134 @@
<?php
$page_title='用户配置';
include('common_head.html');?>
<link href="vendor/datatables/dataTables.bootstrap4.min.css" rel="stylesheet">
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-4 text-gray-800">用户配置</h1>
<small style="color: #e83e8c;">请注意:HighSpeaker是单用户的,您添加的所有用户都具备和您一样的管理员权限并甚至可以删除您的账号!</small>
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">用户列表</h6>
</div>
<div class="card-body">
如遇需更改账号,请先以新账号添加用户,再删除旧账号
<div><code id="notice"></code></div>
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>头像</th>
<th>姓名</th>
<th>邮箱</th>
<th>账号</th>
<th>密码</th>
<th>操作</th>
</tr>
</thead>
<tfoot>
<tr>
<th>头像</th>
<th>姓名</th>
<th>邮箱</th>
<th>账号</th>
<th>密码</th>
<th>操作</th>
</tr>
</tfoot>
<tbody>
<?php
foreach($user as $us){
$us=json_decode($us);
$headurl='https://cravatar.cn/avatar/' . md5(strtolower(trim( $us->email )));
$name='name';
$email='email';
$password='password';
echo <<<EOF
<tr>
<td><img height="35px" style="border-radius: 100%;" src="$headurl"></img></td>
<td><input id="$us->account$name" class="form-control" name="name" value="$us->name" type="text" /></td>
<td><input id="$us->account$email" class="form-control" name="email" value="$us->email" type="email" /></td>
<td>$us->account</td>
<td><input id="$us->account$password" class="form-control" name="passwd" placeholder="不更改请留空" type="password" /></td>
<td><a href="javascript:change('$us->account')" class="btn btn-success btn-circle btn-sm">
<i class="fas fa-check"></i>
</a><a href="#" class="btn btn-danger btn-circle btn-sm">
<i class="fas fa-trash"></i>
</a></td>
</tr>
EOF;
}
?>
<tr>
<td>新用户</td>
<td>管理员</td>
<td>admin@admin.com</td>
<td>admin</td>
<td>Start date</td>
<td>Salary</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
<?php include('common_foot.html');?>
<!-- Page level plugins -->
<script src="vendor/datatables/jquery.dataTables.min.js"></script>
<script src="vendor/datatables/dataTables.bootstrap4.min.js"></script>
<!-- Page level custom scripts -->
<script src="js/demo/datatables-demo.js"></script>
<script>
function change($account){
var name = $("#"+$account+'name').val();
var password = $("#"+$account+"password").val();
var email = $("#"+$account+"email").val();
if(name=="" || email==""){
$('#notice').html('数据不完整');
return false;
}
$.ajax({
type: "POST",
url: '/api/user/change',
data: {'name':name,'password':password,'email':email,'account':$account},
async: false,
dataType: 'json',
cache: false,
beforeSubmit: function () {
$('#notice').html('正在操作');
},
success: function (data) {
if (data.code == 200) {
$('#notice').html('操作成功,即将刷新页面');
$(location).attr('href','user');
} else {
$('#notice').html(data.msg);
}
},
clearForm: false,
resetForm: false
});
}
</script>
</body>
</html>