Commit 211f3cb6 authored by UtopiaXC's avatar UtopiaXC

🌍 重构部分结构,添加站点信息,完善登录退出

parent d4077bde
...@@ -54,7 +54,7 @@ class UserController extends Controller { ...@@ -54,7 +54,7 @@ class UserController extends Controller {
DB::commit(); DB::commit();
$code = md5(Uuid::generate()); $code = md5(Uuid::generate());
$link = env("APP_URL") . \WebUrl::REGISTER_VERIFY . "/" . $code; $link = env("APP_URL") . \WebUrl::REGISTER_VERIFY . "/" . $code;
R::ok(RedisAndCache::setWithExpire(RedisCacheKey::REGISTER_VERIFY . $code, $user->id,15)); R::ok(RedisAndCache::setWithExpire(RedisCacheKey::REGISTER_VERIFY . $code, $user->id, 15));
Mail::to($email)->send(new RegisterVerifyLinkMail($link, $user_name)); Mail::to($email)->send(new RegisterVerifyLinkMail($link, $user_name));
} catch (Exception $e) { } catch (Exception $e) {
DB::rollBack(); DB::rollBack();
...@@ -82,10 +82,25 @@ class UserController extends Controller { ...@@ -82,10 +82,25 @@ class UserController extends Controller {
if (!password_verify($password, $user[0]->user_password)) { if (!password_verify($password, $user[0]->user_password)) {
return R::error(HTTP_CODE::REFUSED_LOGIN_WRONG, $user[0]->user_password); return R::error(HTTP_CODE::REFUSED_LOGIN_WRONG, $user[0]->user_password);
} }
$user_profile = UserProfile::query()->where("user_id", $user[0]->id)->get()[0];
$token = md5($user[0]->id . md5(microtime(true))); $token = md5($user[0]->id . md5(microtime(true)));
$cookie = Cookie::make(\CookieKey::USER_TOKEN, $token, 60 * 24 * 30); $cookie = Cookie::make(env("APP_NAME") . \CookieKey::USER_TOKEN, $token, 60 * 24 * 30);
$expiredMinutes = 60 * 24 * 30; $expiredMinutes = 60 * 24 * 30;
RedisAndCache::setWithExpire(RedisCacheKey::USER_TOKEN . $token, $user[0], $expiredMinutes); RedisAndCache::setWithExpire(RedisCacheKey::USER_TOKEN . $token, $user[0], $expiredMinutes);
RedisAndCache::setWithExpire(RedisCacheKey::USER_PROFILE . $token, $user_profile, $expiredMinutes);
return R::ok()->withCookie($cookie); return R::ok()->withCookie($cookie);
} }
function logout(Request $request) {
$token = $request->cookie(env("APP_NAME").\CookieKey::USER_TOKEN);
$cookie = Cookie::forget(env("APP_NAME") . \CookieKey::USER_TOKEN);
if (!$token) {
return R::ok()->withCookie($cookie);
}
if (RedisAndCache::forget(RedisCacheKey::USER_TOKEN . $token) && RedisAndCache::forget(RedisCacheKey::USER_PROFILE . $token,)) {
return R::ok()->withCookie($cookie);
} else {
return R::error(HTTP_CODE::INTERNAL_SERVER_ERROR);
}
}
} }
...@@ -18,15 +18,16 @@ class UserAuthMiddleware { ...@@ -18,15 +18,16 @@ class UserAuthMiddleware {
* @return mixed * @return mixed
*/ */
public function handle(Request $request, Closure $next) { public function handle(Request $request, Closure $next) {
$token = $request->cookie(CookieKey::USER_TOKEN); $token = $request->cookie(env("APP_NAME").\CookieKey::USER_TOKEN);
if (!$token) { if (!$token) {
$request->attributes->add([HeaderKey::LOGIN_STATUS => false]); $request->attributes->add([HeaderKey::LOGIN_STATUS => false]);
} }
$user = RedisAndCache::get(RedisCacheKey::USER_TOKEN . $token); $user = RedisAndCache::getWithJson(RedisCacheKey::USER_TOKEN . $token);
$user_profile = RedisAndCache::getWithJson(RedisCacheKey::USER_PROFILE . $token);
if (!$user) if (!$user)
$request->attributes->add([HeaderKey::LOGIN_STATUS => false]); $request->attributes->add([HeaderKey::LOGIN_STATUS => false]);
else else
$request->attributes->add([HeaderKey::LOGIN_STATUS => true, HeaderKey::USER_INFO => $user]); $request->attributes->add([HeaderKey::LOGIN_STATUS => true, HeaderKey::USER_INFO => $user, HeaderKey::USER_PROFILE => $user_profile]);
return $next($request); return $next($request);
} }
} }
<?php <?php
class WebUrl class WebUrl {
{
const INDEX = '/'; const INDEX = '/';
const LOGIN = '/login'; const LOGIN = '/login';
const REGISTER = '/register'; const REGISTER = '/register';
const FIND_PASSWORD = '/find_password'; const FIND_PASSWORD = '/find_password';
const REGISTER_VERIFY = "/register_verify";
const ABOUT='/about';
const PRIVACY_POLICY = "/privacy_policy"; const PRIVACY_POLICY = "/privacy_policy";
const REGISTER_VERIFY="/register_verify"; const OPEN_SOURCE='/open_source';
} }
class ApiUrl class ApiUrl {
{
const API = '/api'; const API = '/api';
const USER = '/user'; const USER = '/user';
const CAPTCHA = '/captcha'; const CAPTCHA = '/captcha';
const REGISTER = "/register"; const REGISTER = "/register";
const LOGIN = '/login'; const LOGIN = '/login';
const LOGOUT='/logout';
} }
class Middleware class Middleware {
{
const AUTH_MIDDLEWARE = 'AuthMiddleware'; const AUTH_MIDDLEWARE = 'AuthMiddleware';
const SITE_PROFILE_MIDDLEWARE='SiteProfileMiddleware'; const SITE_PROFILE_MIDDLEWARE = 'SiteProfileMiddleware';
} }
class UserTypeEnum class UserTypeEnum {
{
const ADMIN = "01"; const ADMIN = "01";
const NORMAL = "02"; const NORMAL = "02";
const VIP = "03"; const VIP = "03";
} }
class UserStatusEnum class UserStatusEnum {
{
const NOT_VERITY = "01"; const NOT_VERITY = "01";
const NORMAL = "02"; const NORMAL = "02";
const BANNED = "03"; const BANNED = "03";
const BANNED_FOREVER = "04"; const BANNED_FOREVER = "04";
} }
class RedisCacheKey class RedisCacheKey {
{
const SITE_PROFILE = "site_profile"; const SITE_PROFILE = "site_profile";
const USER_TOKEN = "user_token:"; const USER_TOKEN = "user_token:";
const REGISTER_VERIFY="register_verify:"; const USER_PROFILE = "user_profile:";
const CAPTCHA="captcha:"; const REGISTER_VERIFY = "register_verify:";
const CAPTCHA = "captcha:";
} }
class CookieKey class CookieKey {
{ const USER_TOKEN = "_user_token";
const USER_TOKEN = "user_token";
} }
class HeaderKey class HeaderKey {
{
const LOGIN_STATUS = "login_status"; const LOGIN_STATUS = "login_status";
const USER_INFO="user_info"; const USER_INFO = "user_info";
const SITE_PROFILE="site_profile"; const SITE_PROFILE = "site_profile";
const USER_PROFILE = "user_profile";
} }
class FormKey{ class FormKey {
const CAPTCHA="captcha"; const CAPTCHA = "captcha";
const USER_NAME="user_name"; const USER_NAME = "user_name";
const EMAIL="email"; const EMAIL = "email";
const PASSWORD="password"; const PASSWORD = "password";
const USER="user"; const USER = "user";
} }
class SiteProfileTypeEnum class SiteProfileTypeEnum {
{
const WEB_TITLE = "01"; const WEB_TITLE = "01";
const SITE_URL = "02"; const SITE_URL = "02";
const WEB_FOOTER = "03"; const WEB_FOOTER = "03";
const KEY_WORDS = "04";
const AUTHOR = "05";
const DESCRIPTION = "06";
} }
class DefaultSiteProfile class DefaultSiteProfile {
{
const WEB_TITLE = 'Utopia 开放平台'; const WEB_TITLE = 'Utopia 开放平台';
const SITE_URL = 'http://localhost'; const SITE_URL = 'http://localhost';
const WEB_FOOTER='Copyright ©2021 <a target="_blank" href="https://www.utopiaxc.cn/">UtopiaXC</a> All Rights Reserved | Powered By <a href="https://github.com/UtopiaXC/Utopia-Open-Platform" target="_blank">Utopia Open Platform</a>'; const WEB_FOOTER = 'Copyright ©2021 <a target="_blank" href="https://www.utopiaxc.cn/">UtopiaXC</a> All Rights Reserved | Powered By <a href="https://github.com/UtopiaXC/Utopia-Open-Platform" target="_blank">Utopia Open Platform</a>';
const AUTHOR='UtopiaXC';
const DESCRIPTION='UtopiaXC的个人开放平台';
const KEY_WORDS='UtopiaXC,开放平台,API,开源';
} }
class EnvKey{ class EnvKey {
const REDIS_USE="REDIS_USE"; const REDIS_USE = "REDIS_USE";
} }
class DatabaseDefault{
const USER_AVATAR='/images/avatars/default_avatar.png';
const NO_LOGIN_AVATAR='/images/avatars/user_not_login.png';
}
...@@ -17,7 +17,7 @@ class CreateUsersProfile extends Migration ...@@ -17,7 +17,7 @@ class CreateUsersProfile extends Migration
$table->uuid('id'); $table->uuid('id');
$table->string('user_id'); $table->string('user_id');
$table->string('user_nickname')->nullable();; $table->string('user_nickname')->nullable();;
$table->string('user_avatar')->nullable();; $table->string('user_avatar')->nullable()->default(DatabaseDefault::USER_AVATAR);;
$table->string('user_sex')->nullable();; $table->string('user_sex')->nullable();;
$table->date('user_birthday')->nullable();; $table->date('user_birthday')->nullable();;
$table->string('user_job')->nullable();; $table->string('user_job')->nullable();;
......
...@@ -42,7 +42,35 @@ class SiteProfileSeeder extends Seeder ...@@ -42,7 +42,35 @@ class SiteProfileSeeder extends Seeder
$site_profile->profile_content=\DefaultSiteProfile::WEB_FOOTER; $site_profile->profile_content=\DefaultSiteProfile::WEB_FOOTER;
$site_profile->save(); $site_profile->save();
//网站描述
$site_profile=new SiteProfile();
$site_profile->id=\Uuid::generate();
$site_profile->profile_type=\SiteProfileTypeEnum::DESCRIPTION;
$site_profile->profile_description=trans('site_profile_description.'.\SiteProfileTypeEnum::DESCRIPTION);
$site_profile->profile_content=\DefaultSiteProfile::DESCRIPTION;
$site_profile->save();
//网站作者
$site_profile=new SiteProfile();
$site_profile->id=\Uuid::generate();
$site_profile->profile_type=\SiteProfileTypeEnum::AUTHOR;
$site_profile->profile_description=trans('site_profile_description.'.\SiteProfileTypeEnum::AUTHOR);
$site_profile->profile_content=\DefaultSiteProfile::AUTHOR;
$site_profile->save();
//网站关键词
$site_profile=new SiteProfile();
$site_profile->id=\Uuid::generate();
$site_profile->profile_type=\SiteProfileTypeEnum::KEY_WORDS;
$site_profile->profile_description=trans('site_profile_description.'.\SiteProfileTypeEnum::KEY_WORDS);
$site_profile->profile_content=\DefaultSiteProfile::KEY_WORDS;
$site_profile->save();
}catch (\Exception $e){ }catch (\Exception $e){
echo $e;
DB::rollBack(); DB::rollBack();
} }
DB::commit(); DB::commit();
......
...@@ -3,4 +3,7 @@ return [ ...@@ -3,4 +3,7 @@ return [
SiteProfileTypeEnum::WEB_TITLE => '网站标题', SiteProfileTypeEnum::WEB_TITLE => '网站标题',
SiteProfileTypeEnum::SITE_URL => '网站URL', SiteProfileTypeEnum::SITE_URL => '网站URL',
SiteProfileTypeEnum::WEB_FOOTER=>'网站版权注脚信息', SiteProfileTypeEnum::WEB_FOOTER=>'网站版权注脚信息',
SiteProfileTypeEnum::KEY_WORDS=>'网站关键字',
SiteProfileTypeEnum::AUTHOR=>'网站作者',
SiteProfileTypeEnum::DESCRIPTION=>'网站描述',
]; ];
@extends('root.app')
@section('title')- 关于本站 @endsection
@section('page_content')
<div class="row">
<div class="col-sm-12 col-xl-12">
<div class="card">
<div class="card-body">
<h5 class="card-title">关于本站</h5>
</div>
</div>
</div>
</div>
@endsection
@php
use App\Http\Utils\RedisAndCache;
$user=RedisAndCache::get(RedisCacheKey::REGISTER_VERIFY . request()->get("code"));
if (!$user){
}
@endphp
@extends('root.root') @extends('root.root')
@section('title') - 注册验证 @endsection @section('title') - 注册验证 @endsection
@section('body') @section('body')
{{$code}}
@endsection @endsection
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
font-size: 3em; font-size: 3em;
line-height: 1; line-height: 1;
margin: 0 0 30px;">欢迎注册<br>{{env('APP_SHOW_NAME','Utopia Open Platform')}}</h2> margin: 0 0 30px;">欢迎注册<br>{{env('APP_SHOW_NAME','Utopia Open Platform')}}</h2>
<p style="width: 70%">亲爱的 {{$user}}<br>您已成功注册{{env('APP_SHOW_NAME','Utopia Open Platform')}} <p style="width: 70%">亲爱的 {{$user}}<br>您已成功注册 {{env('APP_SHOW_NAME','Utopia Open Platform')}}
的账户,请点击<a target="_blank" href="{{$link}}">验证链接</a>来激活您的账户功能。验证有效期十五分钟。 <br/><em>如果您点击链接后未跳转,请将以下链接复制到浏览器访问:<br>{{$link}} 的账户,请点击<a target="_blank" href="{{$link}}">验证链接</a>来激活您的账户功能。验证有效期十五分钟。 <br/><em>如果您点击链接后未跳转,请将以下链接复制到浏览器访问:<br>{{$link}}
</em></p> </em></p>
</div> </div>
......
@php
$site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
@endphp
@extends('root.app') @extends('root.app')
@section('title') - 主页 @endsection @section('title')- 主页 @endsection
@section('description') UtopiaXC的个人开放平台 @endsection
@section('keywords') UtopiaXC,开放平台,api,开源 @endsection
@section('author') UtopiaXC @endsection
@section("page_content") @section("page_content")
<div class="row"> <div class="row">
<div class="col-md-6 col-xl-3"> <div class="col-md-6 col-xl-3">
......
@extends('root.root') @extends('root.root')
@section('title') - 登录 @endsection @section('title')- 登录 @endsection
@section('body') @section('body')
<body class="login-page"> <body class="login-page">
...@@ -51,27 +51,12 @@ ...@@ -51,27 +51,12 @@
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="alert" tabindex="-1" aria-labelledby="alert" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="alert_title"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="alert_content"></div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">确认</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="captcha_dialog" tabindex="-1" data-bs-backdrop="static" data-bs-keyboard="false" <div class="modal fade" id="captcha_dialog" tabindex="-1" data-bs-backdrop="static" data-bs-keyboard="false"
aria-labelledby="captcha" aria-hidden="true"> aria-labelledby="captcha" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="captcha_title">CAPTCHA 验证码</h5> <h5 class="modal-title" id="captcha_title">CAPTCHA 验证码</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body" id="captcha_content"> <div class="modal-body" id="captcha_content">
<div id="captcha_process" class="progress"> <div id="captcha_process" class="progress">
...@@ -173,14 +158,5 @@ ...@@ -173,14 +158,5 @@
} }
}) })
} }
function showAlert(title, content) {
let alert = $("#alert")
let title_elem = $("#alert_title")
let content_elem = $("#alert_content")
title_elem.html(title)
content_elem.html(content)
alert.modal('show')
}
</script> </script>
@endsection @endsection
@extends('root.app')
@section('title')- 开放源代码 @endsection
@section('page_content')
<div class="row">
<div class="col-sm-12 col-xl-12">
<div class="card">
<div class="card-body">
<h5 class="card-title">开放源代码</h5>
</div>
</div>
</div>
</div>
@endsection
@extends('root.app')
@section('title')- 隐私政策 @endsection
@section('page_content')
<div class="row">
<div class="col-sm-12 col-xl-12">
<div class="card">
<div class="card-body">
<h5 class="card-title">隐私政策</h5>
</div>
</div>
</div>
</div>
@endsection
@extends('root.root') @extends('root.root')
@section('title') - 注册 @endsection @section('title')- 注册 @endsection
@section('body') @section('body')
<body class="login-page"> <body class="login-page">
...@@ -98,7 +98,6 @@ ...@@ -98,7 +98,6 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="captcha_title">CAPTCHA 验证码</h5> <h5 class="modal-title" id="captcha_title">CAPTCHA 验证码</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body" id="captcha_content"> <div class="modal-body" id="captcha_content">
<div id="captcha_process" class="progress"> <div id="captcha_process" class="progress">
......
@php @php
$site_profile=app('request')->get(HeaderKey::SITE_PROFILE); $site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
$user_logged=app('request')->get(HeaderKey::LOGIN_STATUS);
$user=app('request')->get(HeaderKey::USER_INFO);
$user_profile=app('request')->get(HeaderKey::USER_PROFILE);
@endphp if ($user_logged){
$user_avatar='<li class="nav-item dropdown"><a class="nav-link profile-dropdown" href="#" id="profileDropDown"
role="button" data-bs-toggle="dropdown" aria-expanded="false"><img
src="'.$user_profile["user_avatar"].'" alt=""></a>
<div class="dropdown-menu dropdown-menu-end profile-drop-menu"
aria-labelledby="profileDropDown">
<a class="dropdown-item" href="#"><i data-feather="user"></i>用户中心</a>
<a class="dropdown-item" href="#"><i data-feather="key"></i>OpenKey</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#"><i data-feather="settings"></i>用户设置</a>
<a class="dropdown-item" href="javascript:logout();"><i data-feather="log-out"></i>退出</a></div>
</li>';
}else{
$user_avatar='<li class="nav-item dropdown"><a class="nav-link profile-dropdown" href="#" id="profileDropDown"
role="button" data-bs-toggle="dropdown" aria-expanded="false"><img
src="'.asset(DatabaseDefault::NO_LOGIN_AVATAR).'" alt=""></a>
<div class="dropdown-menu dropdown-menu-end profile-drop-menu"
aria-labelledby="profileDropDown">
<a class="dropdown-item" href="'.WebUrl::LOGIN.'"><i data-feather="key"></i>登录</a>
<a class="dropdown-item" href="'.WebUrl::REGISTER.'"><i data-feather="user"></i>注册</a>
<a class="dropdown-item" href="'.WebUrl::FIND_PASSWORD.'"><i data-feather="key"></i>忘记密码</a>
</li>';
}
@endphp
{{--顶部工具栏--}} {{--顶部工具栏--}}
...@@ -12,12 +39,10 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE); ...@@ -12,12 +39,10 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
<ul class="navbar-nav" id="leftNav"> <ul class="navbar-nav" id="leftNav">
<li class="nav-item"><a class="nav-link" id="sidebar-toggle" href="#"><i <li class="nav-item"><a class="nav-link" id="sidebar-toggle" href="#"><i
data-feather="menu"></i></a></li> data-feather="menu"></i></a></li>
<li class="nav-item"><a class="nav-link" href="/">主页</a></li>
<li class="nav-item"><a class="nav-link" href="#">API</a></li>
<li class="nav-item"><a class="nav-link" href="#">关于</a></li>
</ul> </ul>
</div> </div>
<div><a href="/" style="font-size: larger;color: gray">UtopiaXC开放平台</a></div> <div><a href="{{WebUrl::INDEX}}"
style="font-size: larger;color: gray">{{$site_profile[SiteProfileTypeEnum::WEB_TITLE]}}</a></div>
<div class="" id="headerNav"> <div class="" id="headerNav">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item dropdown"><a class="nav-link search-dropdown" href="#" id="searchDropDown" <li class="nav-item dropdown"><a class="nav-link search-dropdown" href="#" id="searchDropDown"
...@@ -26,23 +51,12 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE); ...@@ -26,23 +51,12 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
<div class="dropdown-menu dropdown-menu-end dropdown-lg search-drop-menu" <div class="dropdown-menu dropdown-menu-end dropdown-lg search-drop-menu"
aria-labelledby="searchDropDown"> aria-labelledby="searchDropDown">
<form> <form>
<input class="form-control" type="text" placeholder="Type something.." <input class="form-control" type="text" placeholder=""
aria-label="Search"> aria-label="Search">
</form> </form>
</div> </div>
</li> </li>
<li class="nav-item dropdown"><a class="nav-link profile-dropdown" href="#" id="profileDropDown" {!! $user_avatar !!}
role="button" data-bs-toggle="dropdown" aria-expanded="false"><img
src="{{asset('/images/avatars/profile-image.png')}}" alt=""></a>
<div class="dropdown-menu dropdown-menu-end profile-drop-menu"
aria-labelledby="profileDropDown">
<a class="dropdown-item" href="#"><i data-feather="user"></i>用户中心</a>
<a class="dropdown-item" href="#"><i data-feather="key"></i>OpenKey</a>
<a class="dropdown-item" href="#"><i data-feather="sliders"></i>系统后台</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#"><i data-feather="settings"></i>用户设置</a>
<a class="dropdown-item" href="#"><i data-feather="log-out"></i>退出</a></div>
</li>
</ul> </ul>
</div> </div>
</nav> </nav>
...@@ -83,8 +97,8 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE); ...@@ -83,8 +97,8 @@ $site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
</ul> </ul>
</li> </li>
<li class="sidebar-title">关于</li> <li class="sidebar-title">关于</li>
<li><a href=""><i data-feather="star"></i>关于本站</a></li> <li><a href="{{WebUrl::ABOUT}}"><i data-feather="star"></i>关于本站</a></li>
<li><a href=""><i data-feather="shield"></i>隐私权</a></li> <li><a href="{{WebUrl::PRIVACY_POLICY}}"><i data-feather="shield"></i>隐私权</a></li>
<li><a href=""><i data-feather="git-commit"></i>开放源代码</a></li> <li><a href="{{WebUrl::OPEN_SOURCE}}"><i data-feather="git-commit"></i>开放源代码</a></li>
</ul> </ul>
</div> </div>
@php
$site_profile=app('request')->get(HeaderKey::SITE_PROFILE);
@endphp
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head> <head>
<title>UtopiaXC开放平台@yield('title')</title> <title>{{$site_profile[SiteProfileTypeEnum::WEB_TITLE]}} @yield('title')</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
......
...@@ -6,3 +6,64 @@ ...@@ -6,3 +6,64 @@
<script src="{{asset('/plugins/perfectscroll/perfect-scrollbar.min.js')}}"></script> <script src="{{asset('/plugins/perfectscroll/perfect-scrollbar.min.js')}}"></script>
<script src="{{asset('/plugins/apexcharts/apexcharts.min.js')}}"></script> <script src="{{asset('/plugins/apexcharts/apexcharts.min.js')}}"></script>
<script src="{{asset('/js/main.min.js')}}"></script> <script src="{{asset('/js/main.min.js')}}"></script>
<script>
function logout() {
$("body").append(' \
<div class="modal fade" id="alert_logout" tabindex="-1" aria-labelledby="alert" aria-hidden="true">\
<div class="modal-dialog">\
<div class="modal-content">\
<div class="modal-header">\
<h5 class="modal-title" id="alert_title">确认退出?</h5>\
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\
</div>\
<div class="modal-body" id="alert_content">您将在本浏览器上退出该账号,请确认您的操作</div>\
<div class="modal-footer">\
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>\
<button type="button" onclick="confirm_logout();" class="btn btn-primary" data-bs-dismiss="modal">确认</button>\
</div>\
</div>\
</div>\
</div>')
let alert = $("#alert_logout")
alert.modal('show')
}
function confirm_logout(){
$.ajax({
type: "PUT",
url: '{{ApiUrl::API.ApiUrl::USER.ApiUrl::LOGOUT}}',
dataType: "json",
success: function (result) {
if (result.code === 200) {
window.location = "/";
} else {
showAlert("抱歉","退出失败")
}
},
error: function () {
showAlert("抱歉","退出失败")
}
});
}
function showAlert(title, content) {
let body= $("body");
body.children("#alert").remove()
body.append(' \
<div class="modal fade" id="alert" tabindex="-1" aria-labelledby="alert" aria-hidden="true">\
<div class="modal-dialog">\
<div class="modal-content">\
<div class="modal-header">\
<h5 class="modal-title" id="alert_title">'+title+'</h5>\
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\
</div>\
<div class="modal-body" id="alert_content">'+content+'</div>\
<div class="modal-footer">\
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">确认</button>\
</div>\
</div>\
</div>\
</div>')
let alert = $("#alert")
alert.modal('show')
}
</script>
...@@ -19,3 +19,4 @@ use Illuminate\Support\Facades\Route; ...@@ -19,3 +19,4 @@ use Illuminate\Support\Facades\Route;
Route::get(ApiUrl::CAPTCHA,[CaptchaController::class,"getCaptcha"]); Route::get(ApiUrl::CAPTCHA,[CaptchaController::class,"getCaptcha"]);
Route::post(ApiUrl::USER.ApiUrl::REGISTER, [UserController::class,"register"]); Route::post(ApiUrl::USER.ApiUrl::REGISTER, [UserController::class,"register"]);
Route::post(ApiUrl::USER.ApiUrl::LOGIN,[UserController::class,"login"]); Route::post(ApiUrl::USER.ApiUrl::LOGIN,[UserController::class,"login"]);
Route::put(ApiUrl::USER.ApiUrl::LOGOUT,[UserController::class,"logout"]);
...@@ -14,16 +14,26 @@ use Illuminate\Support\Facades\Route; ...@@ -14,16 +14,26 @@ use Illuminate\Support\Facades\Route;
*/ */
Route::group(['prefix' => '/', 'middleware' => [Middleware::SITE_PROFILE_MIDDLEWARE, Middleware::AUTH_MIDDLEWARE]], function () { Route::group(['prefix' => '/', 'middleware' => [Middleware::SITE_PROFILE_MIDDLEWARE, Middleware::AUTH_MIDDLEWARE]], function () {
Route::get('/', function () { Route::get(WebUrl::INDEX, function () {
return view('index'); return view('index');
}); });
Route::get("/login", function () { Route::get(WebUrl::LOGIN, function () {
return view('login'); return view('login');
}); });
Route::get("/register", function () { Route::get(WebUrl::REGISTER, function () {
return view('register'); return view('register');
}); });
Route::get("/register_verify/{code}", function ($code) { Route::get(WebUrl::REGISTER_VERIFY."/{code}", function ($code) {
request()->attributes->add(["code"=>$code]);
return view('email.register_verify')->with("code",$code); return view('email.register_verify')->with("code",$code);
}); });
Route::get(WebUrl::ABOUT,function (){
return view('about');
});
Route::get(WebUrl::PRIVACY_POLICY,function (){
return view('privacy_policy');
});
Route::get(WebUrl::OPEN_SOURCE,function (){
return view('open_source');
});
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment