This commit is contained in:
Enoch
2024-08-09 22:16:39 +08:00
commit d78b38e80f
3984 changed files with 416946 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace app\controller;
use support\Request;
class IndexController
{
public function index(Request $request)
{
static $readme;
if (!$readme) {
$readme = file_get_contents(base_path('README.md'));
}
return $readme;
}
public function view(Request $request)
{
return view('index/view', ['name' => 'webman']);
}
public function json(Request $request)
{
return json(['code' => 0, 'msg' => 'ok']);
}
}
+88
View File
@@ -0,0 +1,88 @@
<?php
namespace app\controller;
use support\Request;
use support\Db;
use yzh52521\EasyHttp\Http;
use yzh52521\EasyHttp\Response;
use yzh52521\EasyHttp\RequestException;
class LayAuth
{
public function index(Request $request,$appid)
{
$appquery= Db::table('App')->where('ID', $appid);
if($appquery->doesntExist()){
return view('404');
}
$app=$appquery->first();
$provider= Db::table('Provider')->where('ID', $app->provider)->first();
return view('auth', ['app'=>$app,'provider'=>$provider]);
}
public function callback(Request $request,$appid,$gateway)
{
$appquery= Db::table('App')->where('ID', $appid);
if($appquery->doesntExist()){
return view('404');
}
$app=$appquery->first();
$provider= Db::table('Provider')->where('ID', $app->provider)->first();
switch ($gateway) {
case "qywx":
$code = $request->input('code','null');
if($code=='null'){
return view('auth', ['app'=>$app,'provider'=>$provider,'special'=>'登陆信息无效']);
}
$tokenfile=base_path().'/token/qywx/innerQYWX.token';
if(file_exists($tokenfile)){
$tokencontent=json_decode(file_get_contents($tokenfile));
$fulltoken=$tokencontent->token;
$ddl=$tokencontent->ddl;
if($ddl-time()<180){
$reapply=true;
}else{
$reapply=false;
}
}else{
$reapply=true;
}
if($reapply==true){
$apply=$response = Http::get('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='.getenv('appid').'&corpsecret='.getenv('token'))->json();
$fulltoken=$apply->access_token;
$ddl=time()+$apply->expires_in;
$file=fopen($tokenfile,"w");
fwrite($file, json_encode(array('token'=>$fulltoken,'ddl'=>$ddl)));
fclose($file);
}
$lookup= Http::get('https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token='.$fulltoken.'&code='.$code)->json();
if($lookup->errcode!=0){
return view('auth', ['app'=>$app,'provider'=>$provider,'special'=>'登陆信息无效']);
}else{
$userid=$lookup->userid;
$userinfo=Http::get('https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token='.$fulltoken.'&userid='.$userid)->json();
$username=$userinfo->name;
$userposition=$userinfo->position;
$WT=json_encode(['id'=>$userid,'name'=>$username,'position'=>$userposition,'time'=>time()]);
$key = getenv('aeskey');
$iv = getenv('aesiv');
$WT = encryptAES($WT, $key, $iv);
$dest=$app->redirect;
return view('success', ['app'=>$app,'provider'=>$provider,'dest'=>$dest,'userinfo'=>$userinfo])->cookie('WT', $WT,time()+9600,'/','.laysense.cn');
}
break;
default:
return view('auth', ['app'=>$app,'provider'=>$provider,'special'=>'验证方式无效或不存在']);
}
return view('auth', ['app'=>$app,'provider'=>$provider,'special'=>'验证方式无效或不存在']);
}
public function check(Request $request,$appid)
{
return json(['code' => 0, 'msg' => 'ok']);
}
}
+4
View File
@@ -0,0 +1,4 @@
<?php
/**
* Here is your custom functions.
*/
+42
View File
@@ -0,0 +1,42 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
/**
* Class StaticFile
* @package app\middleware
*/
class StaticFile implements MiddlewareInterface
{
public function process(Request $request, callable $next): Response
{
// Access to files beginning with. Is prohibited
if (strpos($request->path(), '/.') !== false) {
return response('<h1>403 forbidden</h1>', 403);
}
/** @var Response $response */
$response = $next($request);
// Add cross domain HTTP header
/*$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Credentials' => 'true',
]);*/
return $response;
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace app\model;
use support\Model;
class Test extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'test';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
}
+68
View File
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html lang="zh" class="h-full">
<head>
<!-- Required Meta Tags Always Come First -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Laysense Auth">
<!-- Title -->
<title>Laysense Auth</title>
<!-- Favicon -->
<link rel="shortcut icon" href="https://static.laysense.cn/data/file/_4335ce.png?1709117691655">
<!-- Font -->
<!-- Theme Check and Update -->
<script>
const html = document.querySelector('html');
const isLightOrAuto = localStorage.getItem('hs_theme') === 'light' || (localStorage.getItem('hs_theme') === 'auto' && !window.matchMedia('(prefers-color-scheme: dark)').matches);
const isDarkOrAuto = localStorage.getItem('hs_theme') === 'dark' || (localStorage.getItem('hs_theme') === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);
if (isLightOrAuto && html.classList.contains('dark')) html.classList.remove('dark');
else if (isDarkOrAuto && html.classList.contains('light')) html.classList.remove('light');
else if (isDarkOrAuto && !html.classList.contains('dark')) html.classList.add('dark');
else if (isLightOrAuto && !html.classList.contains('light')) html.classList.add('light');
</script>
<!-- CSS HS -->
<link rel="stylesheet" href="https://static.laysense.cn/data/file/cdn/preline.css">
</head>
<body class="flex h-full items-center py-16 dark:bg-neutral-800" background="https://bing.img.run/1920x1080.php">
<!-- ========== MAIN CONTENT ========== -->
<main id="content" class="w-full max-w-md mx-auto p-6">
<div class="mt-7 border border-gray-200 rounded-xl shadow-sm dark:bg-neutral-900 dark:border-neutral-700" style="background: rgba(255, 255, 255, 0.6);-webkit-backdrop-filter: blur(10px);backdrop-filter: blur(10px);">
<div class="p-4 sm:p-7">
<div class="text-center">
<h1 class="block text-2xl font-bold text-gray-800 dark:text-white" ><img src="https://static.laysense.cn/data/file/laysenseW.png" style="height:30px;" />应用未注册或不存在</h1>
<p class="mt-2 text-sm text-gray-600 dark:text-neutral-400">
抱歉,未能找到该应用的注册信息,可能是应用不存在或已被删除,您可以选择
<a class="text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500" href="https://laysense.cn/" target="_blank">
前往来笙
</a>
</p>
</div>
</div>
</div>
<p class="mt-3 flex justify-center items-center text-center divide-x divide-gray-300 dark:divide-neutral-700">
©上海来笙信息科技有限公司 2024 </p>
</main>
<!-- ========== END MAIN CONTENT ========== -->
<!-- JS Implementing Plugins -->
<!-- JS PLUGINS -->
<!-- Required plugins -->
<script src="https://static.laysense.cn/data/file/cdn/preline.js"></script>
<!-- JS THIRD PARTY PLUGINS -->
</body>
</html>
+146
View File
@@ -0,0 +1,146 @@
<?php if(!isset($special)){ $special=false;}?>
<!DOCTYPE html>
<html lang="zh" class="h-full">
<head>
<!-- Required Meta Tags Always Come First -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Laysense Auth">
<!-- Title -->
<title>Laysense Auth</title>
<!-- Favicon -->
<link rel="shortcut icon" href="https://static.laysense.cn/data/file/_4335ce.png?1709117691655">
<!-- Font -->
<!-- Theme Check and Update -->
<script>
const html = document.querySelector('html');
const isLightOrAuto = localStorage.getItem('hs_theme') === 'light' || (localStorage.getItem('hs_theme') === 'auto' && !window.matchMedia('(prefers-color-scheme: dark)').matches);
const isDarkOrAuto = localStorage.getItem('hs_theme') === 'dark' || (localStorage.getItem('hs_theme') === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);
if (isLightOrAuto && html.classList.contains('dark')) html.classList.remove('dark');
else if (isDarkOrAuto && html.classList.contains('light')) html.classList.remove('light');
else if (isDarkOrAuto && !html.classList.contains('dark')) html.classList.add('dark');
else if (isLightOrAuto && !html.classList.contains('light')) html.classList.add('light');
</script>
<!-- CSS HS -->
<link rel="stylesheet" href="https://static.laysense.cn/data/file/cdn/preline.css">
</head>
<body class="flex h-full items-center py-16 dark:bg-neutral-800" background="https://bing.img.run/1920x1080.php" style="background-size: 100% 100%;">
<!-- ========== MAIN CONTENT ========== -->
<main id="content" class="w-full max-w-md mx-auto p-6">
<div class="mt-7 border border-gray-200 rounded-xl shadow-sm dark:bg-neutral-900 dark:border-neutral-700" style="background: rgba(255, 255, 255, 0.6);-webkit-backdrop-filter: blur(10px);backdrop-filter: blur(10px);">
<div class="p-4 sm:p-7">
<div class="text-center">
<h1 class="block text-2xl font-bold text-gray-800 dark:text-white" ><img src="https://static.laysense.cn/data/file/laysenseW.png" style="height:30px;" />来笙统一认证</h1>
<p class="mt-2 text-sm text-gray-600 dark:text-neutral-400">
没有账号?
<a class="text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500" href="javascript:alert('暂未开放');">
注册来笙账号
</a>
</p>
</div>
<div class="py-3 flex items-center text-xs text-gray-400 uppercase before:flex-1 before:border-t before:border-gray-200 before:me-6 after:flex-1 after:border-t after:border-gray-200 after:ms-6 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600">您即将登录</div>
<div class="shrink-0 group block ">
<div class="flex items-center">
<img class="inline-block shrink-0 size-[62px] rounded-full" src="<?php echo($app->img);?>" alt="Avatar">
<div class="ms-3">
<h3 class="font-semibold text-gray-800 dark:text-white"><?php echo($app->name);?></h3>
<p class="text-sm font-medium text-gray-400 dark:text-neutral-500"><?php echo($app->info);?></p>
</div>
</div>
<p class="mt-2 text-sm text-gray-600 dark:text-neutral-400 text-center" >
<a class="text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500" href="<?php echo($provider->url);?>" target="_blank">
<?php echo($provider->name);?>
</a>
提供
</p>
</div>
<div class="py-3 flex items-center text-xs text-gray-400 uppercase before:flex-1 before:border-t before:border-gray-200 before:me-6 after:flex-1 after:border-t after:border-gray-200 after:ms-6 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600">公共登录</div>
<div class="flex flex-row <?php if($app->public==false){echo("hidden");}?>" >
<button type="button" class="mx-2 px-6 mb-4 w-full py-3 px-4 inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-blue-600 text-blue-600 hover:border-blue-500 hover:text-blue-500 focus:outline-none focus:border-blue-500 focus:text-blue-500 disabled:opacity-50 disabled:pointer-events-none dark:border-blue-500 dark:text-blue-500 dark:hover:text-blue-400 dark:hover:border-blue-400">
<svg t="1722956204076" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5325" width="24" height="24"><path d="M0 0h486.592v486.592H0z" fill="#F25022" p-id="5326"></path><path d="M537.408 0H1024v486.592H537.408z" fill="#7FBA00" p-id="5327"></path><path d="M0 537.408h486.592V1024H0z" fill="#00A4EF" p-id="5328"></path><path d="M537.408 537.408H1024V1024H537.408z" fill="#FFB900" p-id="5329"></path></svg>
Microsoft
</button><button type="button" class="mx-2 mb-4 w-full py-3 px-4 inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-800 text-gray-800 hover:border-gray-500 hover:text-gray-500 focus:outline-none focus:border-gray-500 focus:text-gray-500 disabled:opacity-50 disabled:pointer-events-none dark:border-white dark:text-white dark:hover:text-neutral-300 dark:hover:border-neutral-300">
<svg t="1722956228995" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6336" width="24" height="24"><path d="M64 512c0 195.2 124.8 361.6 300.8 422.4 22.4 6.4 19.2-9.6 19.2-22.4v-76.8c-134.4 16-140.8-73.6-150.4-89.6-19.2-32-60.8-38.4-48-54.4 32-16 64 3.2 99.2 57.6 25.6 38.4 76.8 32 105.6 25.6 6.4-22.4 19.2-44.8 35.2-60.8-144-22.4-201.6-108.8-201.6-211.2 0-48 16-96 48-131.2-22.4-60.8 0-115.2 3.2-121.6 57.6-6.4 118.4 41.6 124.8 44.8 32-9.6 70.4-12.8 112-12.8 41.6 0 80 6.4 112 12.8 12.8-9.6 67.2-48 121.6-44.8 3.2 6.4 25.6 57.6 6.4 118.4 32 38.4 48 83.2 48 131.2 0 102.4-57.6 188.8-201.6 214.4 22.4 22.4 38.4 54.4 38.4 92.8v112c0 9.6 0 19.2 16 19.2C832 876.8 960 710.4 960 512c0-246.4-201.6-448-448-448S64 265.6 64 512z" fill="#040000" p-id="6337"></path></svg>
Github
</button>
</div>
<p class="text-center mt-2 text-sm text-gray-600 dark:text-neutral-400 <?php if($app->public==true){echo("hidden");}?>" >
当前应用仅支持来笙内部使用,不对外开放
</p>
<div class="py-3 flex items-center text-xs text-gray-400 uppercase before:flex-1 before:border-t before:border-gray-200 before:me-6 after:flex-1 after:border-t after:border-gray-200 after:ms-6 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600">来笙内部登录</div>
<div >
<a href="https://login.work.weixin.qq.com/wwlogin/sso/login?login_type=CorpApp&appid=<?php echo(getenv('appid'));?>&agentid=<?php echo(getenv('agentid'));?>&redirect_uri=https://<?php echo(getenv('weburl'));?>/auth/lay/<?php echo($app->ID);?>/qywx/callback" class=" mb-4 w-full py-3 px-4 inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 focus:outline-none focus:bg-teal-200 disabled:opacity-50 disabled:pointer-events-none dark:text-teal-500 dark:bg-teal-800/30 dark:hover:bg-teal-800/20 dark:focus:bg-teal-800/20">
<svg t="1722953611732" class="icon" viewBox="0 0 1229 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4326" width="24" height="24"><path d="M702.72 849.92c-76.8 30.72-158.72 35.84-240.64 30.72-35.84-5.12-71.68-10.24-107.52-20.48-5.12 0-10.24 0-15.36 5.12-46.08 20.48-92.16 46.08-133.12 66.56-15.36 10.24-30.72 10.24-46.08 0s-15.36-25.6-15.36-46.08c10.24-35.84 10.24-71.68 15.36-107.52 0-5.12-5.12-10.24-5.12-15.36-51.2-51.2-92.16-102.4-122.88-168.96-51.2-122.88-40.96-245.76 30.72-358.4C134.4 112.64 247.04 46.08 380.16 15.36S641.28 0 764.16 61.44c112.64 56.32 194.56 143.36 230.4 266.24 15.36 46.08 20.48 92.16 15.36 138.24-25.6-25.6-56.32-30.72-87.04-15.36 0-30.72 0-61.44-10.24-92.16-20.48-71.68-61.44-128-112.64-174.08-87.04-71.68-194.56-102.4-307.2-102.4-117.76 10.24-220.16 51.2-302.08 133.12-66.56 66.56-102.4 148.48-97.28 245.76 5.12 81.92 40.96 148.48 92.16 204.8l40.96 40.96c20.48 15.36 25.6 30.72 15.36 51.2-5.12 20.48-10.24 46.08-15.36 66.56 0 5.12-5.12 10.24 0 10.24 5.12 5.12 10.24 0 10.24 0 25.6-15.36 56.32-30.72 81.92-51.2 15.36-10.24 30.72-10.24 51.2-5.12 87.04 25.6 179.2 25.6 266.24 0 5.12 0 10.24-5.12 10.24 5.12 10.24 30.72 25.6 51.2 56.32 66.56z" fill="#0082EF" p-id="4327"></path><path d="M1214.72 747.52c0 35.84-25.6 61.44-56.32 66.56-51.2 10.24-92.16 30.72-128 66.56-10.24 10.24-15.36 10.24-25.6 5.12-5.12-5.12-5.12-15.36 0-25.6 35.84-35.84 56.32-81.92 66.56-128 5.12-35.84 40.96-56.32 76.8-56.32 40.96 5.12 66.56 35.84 66.56 71.68z" fill="#0081EE" p-id="4328"></path><path d="M953.6 1024c-35.84 0-66.56-25.6-71.68-56.32-5.12-51.2-30.72-92.16-66.56-122.88-5.12-5.12-10.24-10.24-5.12-20.48 5.12-15.36 15.36-15.36 25.6-10.24 10.24 5.12 15.36 15.36 20.48 20.48 30.72 25.6 66.56 40.96 102.4 46.08 35.84 5.12 61.44 40.96 56.32 76.8 5.12 35.84-25.6 66.56-61.44 66.56z" fill="#FA6202" p-id="4329"></path><path d="M682.24 757.76c0-35.84 20.48-61.44 56.32-71.68 51.2-10.24 92.16-30.72 128-66.56 10.24-10.24 20.48-10.24 25.6 0 5.12 5.12 5.12 15.36-5.12 25.6-30.72 30.72-51.2 66.56-61.44 112.64 0 5.12 0 15.36-5.12 20.48-10.24 35.84-40.96 56.32-76.8 51.2-35.84-5.12-61.44-35.84-61.44-71.68z" fill="#FECD00" p-id="4330"></path><path d="M1035.52 578.56c15.36 30.72 30.72 56.32 51.2 76.8 10.24 10.24 10.24 20.48 5.12 25.6-5.12 10.24-15.36 10.24-25.6 0-25.6-30.72-61.44-51.2-97.28-61.44-10.24-5.12-20.48-5.12-30.72-5.12-20.48-5.12-40.96-15.36-46.08-40.96-10.24-25.6-10.24-51.2 10.24-71.68 20.48-25.6 46.08-30.72 71.68-25.6 25.6 10.24 46.08 25.6 51.2 56.32 0 15.36 5.12 30.72 10.24 46.08z" fill="#2CBD00" p-id="4331"></path></svg>
企业微信登录
</a>
</div>
</div>
</div>
<!-- Toast -->
<div class="absolute top-3 end-3 <?php if($special=='false'){echo "hidden";}?>" >
<div class="max-w-xs bg-white border border-gray-200 rounded-xl shadow-lg dark:bg-neutral-800 dark:border-neutral-700" role="alert" tabindex="-1" aria-labelledby="hs-toast-warning-example-label">
<div class="flex p-4">
<div class="shrink-0">
<svg class="shrink-0 size-4 text-yellow-500 mt-0.5" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"></path>
</svg>
</div>
<div class="ms-3">
<p id="hs-toast-warning-example-label" class="text-sm text-gray-700 dark:text-neutral-400">
登录未能完成:<?php echo($special);?>
</p>
</div>
</div>
</div>
</div>
<!-- End Toast -->
<p class="mt-3 flex justify-center items-center text-center divide-x divide-gray-300 dark:divide-neutral-700">
<a class="pe-3.5 inline-flex items-center gap-x-2 text-sm text-gray-600 decoration-2 hover:underline hover:text-blue-600 dark:text-neutral-500 dark:hover:text-neutral-200" href="../../examples.html">
<svg t="1722960727914" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3218" width="20" height="20"><path d="M960.288 787.488c-98.88-154.08-287.36-469.568-385.76-622.912-21.44-27.968-71.872-44-102.88 0L61.504 803.872c-23.36 33.888-23.008 79.872 49.376 82.432h824.64c48.416-2.784 48.416-62.496 24.768-98.816z m-437.44-27.776a47.296 47.296 0 1 1 0-94.592 47.296 47.296 0 0 1 0 94.592z m35.456-165.536c0.448 11.52-10.944 23.68-23.648 23.68h-23.648c-12.672 0-23.2-12.16-23.616-23.68l-23.68-224.64c0-19.552 15.904-35.456 35.488-35.456h47.296c19.584 0 35.456 15.904 35.456 35.488l-23.648 224.64z" fill="#111111" p-id="3219"></path></svg>
举报该应用
</a>
</p>
<p class="mt-3 flex justify-center items-center text-center divide-x divide-gray-300 dark:divide-neutral-700">
©上海来笙信息科技有限公司 2024 </p>
<p class="text-sm mt-3 flex justify-center items-center text-center divide-x divide-gray-300 dark:divide-neutral-700">
<a class="mx text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline dark:text-blue-500" href="https://laysense.cn" target="_blank">
来笙隐私条款&ensp;
</a><a class="text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline dark:text-blue-500" href="https://laysense.cn" target="_blank">
&ensp;此应用的隐私政策
</a>
</p>
</main>
<!-- ========== END MAIN CONTENT ========== -->
<!-- JS Implementing Plugins -->
<!-- JS PLUGINS -->
<!-- Required plugins -->
<script src="https://static.laysense.cn/data/file/cdn/preline.js"></script>
<!-- JS THIRD PARTY PLUGINS -->
</body>
</html>
+101
View File
@@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="zh" class="h-full">
<head>
<!-- Required Meta Tags Always Come First -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Laysense Auth">
<!-- Title -->
<title>Laysense Auth</title>
<!-- Favicon -->
<link rel="shortcut icon" href="https://static.laysense.cn/data/file/_4335ce.png?1709117691655">
<!-- Font -->
<!-- Theme Check and Update -->
<script>
const html = document.querySelector('html');
const isLightOrAuto = localStorage.getItem('hs_theme') === 'light' || (localStorage.getItem('hs_theme') === 'auto' && !window.matchMedia('(prefers-color-scheme: dark)').matches);
const isDarkOrAuto = localStorage.getItem('hs_theme') === 'dark' || (localStorage.getItem('hs_theme') === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches);
if (isLightOrAuto && html.classList.contains('dark')) html.classList.remove('dark');
else if (isDarkOrAuto && html.classList.contains('light')) html.classList.remove('light');
else if (isDarkOrAuto && !html.classList.contains('dark')) html.classList.add('dark');
else if (isLightOrAuto && !html.classList.contains('light')) html.classList.add('light');
</script>
<!-- CSS HS -->
<link rel="stylesheet" href="https://static.laysense.cn/data/file/cdn/preline.css">
</head>
<body class="flex h-full items-center py-16 dark:bg-neutral-800" background="https://bing.img.run/1920x1080.php" style="background-size: 100% 100%;">
<!-- ========== MAIN CONTENT ========== -->
<main id="content" class="w-full max-w-md mx-auto p-6">
<div class="mt-7 border border-gray-200 rounded-xl shadow-sm dark:bg-neutral-900 dark:border-neutral-700" style="background: rgba(255, 255, 255, 0.6);-webkit-backdrop-filter: blur(10px);backdrop-filter: blur(10px);">
<div class="p-4 sm:p-7">
<div class="text-center">
<h1 class="block text-2xl font-bold text-gray-800 dark:text-white" ><img src="https://static.laysense.cn/data/file/laysenseW.png" style="height:30px;" />欢迎回来,<?php echo($userinfo->name);?></h1>
<p class="mt-2 text-sm text-gray-600 dark:text-neutral-400">
<?php echo($userinfo->position);?>
</p>
</div>
<div class="py-3 flex items-center text-xs text-gray-400 uppercase before:flex-1 before:border-t before:border-gray-200 before:me-6 after:flex-1 after:border-t after:border-gray-200 after:ms-6 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600">您即将进入</div>
<div class="shrink-0 group block ">
<div class="flex items-center">
<img class="inline-block shrink-0 size-[62px] rounded-full" src="<?php echo($app->img);?>" alt="Avatar">
<div class="ms-3">
<h3 class="font-semibold text-gray-800 dark:text-white"><?php echo($app->name);?></h3>
<p class="text-sm font-medium text-gray-400 dark:text-neutral-500"><?php echo($app->info);?></p>
</div>
</div>
<p class="mt-2 text-sm text-gray-600 dark:text-neutral-400 text-center" >
<a class="text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500" href="<?php echo($provider->url);?>" target="_blank">
<?php echo($provider->name);?>
</a>
提供
</p>
</div>
<div class="py-3 flex items-center text-xs text-gray-400 uppercase before:flex-1 before:border-t before:border-gray-200 before:me-6 after:flex-1 after:border-t after:border-gray-200 after:ms-6 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600">正在前往,请稍等</div>
<div >
<button class=" mb-4 w-full py-3 px-4 inline-flex justify-center items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-teal-100 text-teal-800 hover:bg-teal-200 focus:outline-none focus:bg-teal-200 disabled:opacity-50 disabled:pointer-events-none dark:text-teal-500 dark:bg-teal-800/30 dark:hover:bg-teal-800/20 dark:focus:bg-teal-800/20">
<div class="animate-spin inline-block size-6 border-[3px] border-current border-t-transparent text-blue-600 rounded-full dark:text-blue-500" role="status" aria-label="loading">
<span class="sr-only">Loading...</span>
</div>
</button>
</div>
</div>
</div>
<p class="mt-3 flex justify-center items-center text-center divide-x divide-gray-300 dark:divide-neutral-700">
©上海来笙信息科技有限公司 2024 </p>
</main>
<!-- ========== END MAIN CONTENT ========== -->
<!-- JS Implementing Plugins -->
<!-- JS PLUGINS -->
<!-- Required plugins -->
<script src="https://static.laysense.cn/data/file/cdn/preline.js"></script>
<script>
setTimeout("location.href='<?php echo($dest);?>'",3000);
</script>
<!-- JS THIRD PARTY PLUGINS -->
</body>
</html>