pref: 增加服务类优化UI版面

This commit is contained in:
Ying
2023-06-19 14:32:30 +08:00
parent 27eda6f37f
commit 2b8f874450
148 changed files with 3933 additions and 9286 deletions

View File

@@ -12,17 +12,8 @@
namespace app\index\controller;
use app\common\library\Email;
use app\common\library\Sms;
use app\common\model\system\User;
use app\HomeController;
use PHPMailer\PHPMailer\Exception;
use Psr\SimpleCache\InvalidArgumentException;
use support\Response;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\response\Json;
/**
* Ajax控制器
@@ -35,86 +26,6 @@ class Ajax extends HomeController
*/
public function index(): Response
{
return \response('Hello SWIFT!', 200);
}
/**
* 发送短信验证码
* @throws DataNotFoundException
* @throws DbException
* @throws InvalidArgumentException
* @throws ModelNotFoundException
*/
public function smsSend()
{
if (request()->isPost()) {
$mobile = input('mobile');
$event = input('event', 'register');
if (!is_mobile($mobile)) {
return $this->error('手机号码不正确');
}
$sms = Sms::instance();
$data = $sms->getLast($mobile);
if ($data && (time() - strtotime($data['create_time'])) < 60) {
return $this->error(__('发送频繁'));
}
$user = User::getByMobile($mobile);
if (in_array($event, ['register', 'changer']) && $user) {
return $this->error('当前手机号已被占用');
} else if ($event == 'forgot' && !$user) {
return $this->error('当前手机号未注册');
}
if ($sms->send($mobile, $event)) {
return $this->success("验证码发送成功!");
} else {
return $this->error($sms->getError());
}
}
}
/**
* 发送邮件验证码
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
* @throws InvalidArgumentException
*/
public function emailSend()
{
if (request()->isPost()) {
$email = input('email');
$event = input('event', 'register');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return $this->error('邮件格式不正确');
}
$Ems = Email::instance();
$data = $Ems->getLast($email);
if ($data && (time() - strtotime($data['create_time'])) < 60) {
return $this->error(__('发送频繁'));
}
$user = User::getByEmail($email);
if (in_array($event, ['register', 'changer']) && $user) {
return $this->error('当前邮箱已被注册');
} else if ($event == 'forgot' && !$user) {
return $this->error('当前邮箱不存在');
}
if ($Ems->captcha($email, $event)->send()) {
return $this->success("验证码发送成功!");
} else {
return $this->error($Ems->getError());
}
}
return \response('Hello swiftadmin!', 200);
}
}

View File

@@ -12,11 +12,8 @@ declare (strict_types=1);
namespace app\index\controller;
use app\HomeController;
use support\Response;
use Psr\SimpleCache\InvalidArgumentException;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use support\Response;
class Index extends HomeController
{
@@ -24,19 +21,9 @@ class Index extends HomeController
* 前端首页
* @return Response
* @throws InvalidArgumentException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function index(): Response
{
$data = [
'欢迎使用swiftAdmin极速开发框架',
__DIR__.'\Index.php 正在使用halt函数输出到浏览器',
'请在app\index\controller\Index.php中删除halt函数',
];
halt($data);
return $this->view('index/index', ['name' => 'meystack']);
}
}

View File

@@ -12,11 +12,13 @@ declare (strict_types=1);
namespace app\index\controller;
use app\common\library\Auth;
use app\common\library\ResultCode;
use app\common\service\user\UserService;
use app\common\service\user\UserTokenService;
use app\HomeController;
use app\common\model\system\User;
use app\common\model\system\UserThird;
use Psr\SimpleCache\InvalidArgumentException;
use support\Response;
use system\Random;
use think\db\exception\DataNotFoundException;
@@ -87,10 +89,11 @@ class Third extends HomeController
/**
* 用户回调函数
* @return mixed|void
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws InvalidArgumentException
*/
public function callback()
{
@@ -100,9 +103,9 @@ class Third extends HomeController
return $this->error($e->getMessage());
}
$user = $this->oauth->getUserInfo();
if (!empty($user) && !$this->auth->isLogin()) {
if (!empty($user) && !UserTokenService::isLogin()) {
return $this->register($user, $this->type);
} else if ($this->auth->isLogin()) { // 绑定用户
} else if (UserTokenService::isLogin()) { // 绑定用户
return $this->doBind($user, $this->type);
}
}
@@ -123,31 +126,28 @@ class Third extends HomeController
$userInfo = UserThird::alias('th')->view('user', '*', 'user.id=th.user_id')->where(['openid' => $openid, 'type' => $type])->find();
if (!empty($userInfo)) {
$array['id'] = $userInfo['id'];
$array['login_time'] = time();
$array['login_ip'] = request()->getRealIp();
$array['login_count'] = $userInfo['login_count'] + 1;
if (User::update($array)) {
$response = $this->auth->responseToken($userInfo);
$response->withBody(json_encode(ResultCode::LOGINSUCCESS))->redirect(request()->cookie('redirectUrl', '/'));
if (User::update($array, ['id' => $userInfo['user_id']])) {
UserService::createUserCookies($userInfo);
return redirect(request()->cookie('redirectUrl', '/'));
}
} else {
// 注册本地用户
$data['nickname'] = $nickname;
$data['avatar'] = $info['userData']['avatar'];
$post['nickname'] = $nickname;
$post['avatar'] = $info['userData']['avatar'];
if (User::getByNickname($nickname)) {
$data['nickname'] .= Random::alpha(3);
$post['nickname'] .= Random::alpha(3);
}
$data['group_id'] = 1;
$data['create_ip'] = request()->getRealIp();
$result = $this->auth->register($data);
$post['group_id'] = 1;
$post['create_ip'] = request()->getRealIp();
$result = UserService::register($post);
// 封装第三方数据
if (!empty($result)) {
$userThird = [
$third = [
'type' => $this->type,
'user_id' => $result['id'],
'openid' => $openid,
@@ -158,13 +158,10 @@ class Third extends HomeController
'login_time' => time(),
'expiretime' => time() + $info['expires_in'],
];
}
// 注册第三方数据
if (isset($userThird) && is_array($userThird)) {
if (UserThird::create($userThird)) {
$response = $this->auth->responseToken($result);
$response->withBody(json_encode(ResultCode::LOGINSUCCESS))->redirect(request()->cookie('redirectUrl', '/'));
if (UserThird::create($third)) {
UserService::createUserCookies($result);
return redirect(request()->cookie('redirectUrl', '/'));
}
}
}
@@ -175,17 +172,18 @@ class Third extends HomeController
/**
* 用户绑定操作
* @return Response
* @throws InvalidArgumentException
*/
public function bind(): Response
{
if (Auth::instance()->isLogin()) {
if (UserTokenService::isLogin()) {
$buildQuery = [
'bind' => true,
'type' => input('type'),
'ref' => input('ref', request()->server('HTTP_REFERER', '/')),
];
return $this->redirect("/third/login?" . http_build_query($buildQuery));
return $this->redirect("/third/login?" . http_build_query($buildQuery));
}
return $this->error('请先登录');
@@ -193,7 +191,9 @@ class Third extends HomeController
/**
* 用户解除绑定
* @return Response
* @throws DbException
* @throws InvalidArgumentException
*/
public function unbind(): Response
{
@@ -202,23 +202,22 @@ class Third extends HomeController
} catch (\Exception $e) {
return $this->error($e->getMessage());
}
if ($this->auth->isLogin()) {
$result = $this->auth->userInfo;
if (!empty($result)) {
$result = UserTokenService::isLogin();
if (!empty($result)) {
if (empty($result['email']) || empty($result['pwd'])) {
return $this->error('解除绑定需要设置邮箱和密码!');
}
if (empty($result['email']) || empty($result['pwd'])) {
return $this->error('解除绑定需要设置邮箱和密码!');
}
$where['type'] = $this->type;
$where['user_id'] = request()->cookie('uid');
if (UserThird::where($where)->delete()) {
return $this->success('解除绑定成功!');
}
$where['type'] = $this->type;
$where['user_id'] = request()->cookie('uid');
if (UserThird::where($where)->delete()) {
return $this->success('解除绑定成功!');
}
}
return $this->error();
}
@@ -233,10 +232,8 @@ class Third extends HomeController
*/
protected function doBind(array $info = [], string $type = null)
{
$openid = $info['openid'] ?? $info['id'];
$nickname = $info['userData']['name'] ?? $info['userData']['nickname'];
// 查询是否被注册
$where['openid'] = $openid;
$where['type'] = $this->type;
@@ -277,7 +274,7 @@ class Third extends HomeController
$referer = '/';
}
request()->cookie('redirectUrl', null,1);
request()->cookie('redirectUrl', null, 1);
return $this->redirect($referer);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,8 +2,9 @@
namespace app\index\middleware\system;
use app\common\library\Auth;
use app\common\library\ResultCode;
use app\common\service\user\UserTokenService;
use Psr\SimpleCache\InvalidArgumentException;
use support\View;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
@@ -32,22 +33,23 @@ class IndexPermissions implements MiddlewareInterface
* 非鉴权方法
* @var array
*/
public array $noNeedAuth = [];
public array $noNeedLogin = [];
/**
* 跳转URL地址
* @var string
*/
public string $JumpUrl = '/index/user/index';
public string $JumpUrl = '/index/';
/**
* 校验权限
* @param Request $request
* @param \support\Request|Request $request
* @param callable $handler
* @return Response
* @throws InvalidArgumentException
* @throws \ReflectionException
*/
public function process(Request $request, callable $handler): Response
public function process(\support\Request|Request $request, callable $handler): Response
{
$app = request()->getApp();
$controller = request()->getController();
@@ -56,23 +58,23 @@ class IndexPermissions implements MiddlewareInterface
$refClass = new \ReflectionClass($request->controller);
$property = $refClass->getDefaultProperties();
$this->needLogin = $property['needLogin'] ?? false;
$this->noNeedAuth = $property['noNeedAuth'] ?? $this->noNeedAuth;
$this->noNeedLogin = $property['noNeedLogin'] ?? $this->noNeedLogin;
$this->repeatLogin = $property['repeatLogin'] ?? $this->repeatLogin;
$this->JumpUrl = $property['JumpUrl'] ?? $this->JumpUrl;
// 是否验证登录器
$auth = Auth::instance();
if ($auth->isLogin()) {
// 禁止重复登录
$userInfo = UserTokenService::isLogin();
if (!empty($userInfo)) {
if (in_array($action, $this->repeatLogin)) {
var_dump($this->JumpUrl);
return redirect($this->JumpUrl);
}
View::assign('user', $auth->userInfo);
$request->userId = $userInfo['id'];
$request->userInfo = $userInfo;
View::assign('user', $userInfo);
} else {
if ($this->needLogin && !in_array($action, $this->noNeedAuth)) {
if ($this->needLogin && !in_array($action, $this->noNeedLogin)) {
if (\request()->isAjax()) {
return json(ResultCode::PLEASELOGININ);
} else {

View File

@@ -15,7 +15,7 @@
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md6">
<div class="layui-swift-box">
<div class="layui-swift-box">
<h1>SWIFTADMIN 极速开发框架</h1>
<h1 style="font-size: 26px; font-weight: 300">基于高性能WM框架性能在TP5 10倍以上</h1>
<p>SwiftAdmin框架主张简单就是高效的原则在设计和运维上采用最精简最高效的做法去完成业务系统的需求并且基于ant Design的设计原则是一款优秀的前后台极速开发解决方案。相信你第一眼就有立刻想体验SwiftAdmin框架的冲动和热情</p>

View File

@@ -7,7 +7,6 @@
<link rel="stylesheet" href="/static/js/layui/css/layui.css">
<link rel="stylesheet" href="/static/css/style.css?v={:release()}">
<script src="/static/js/layui/layui.js"></script>
<script src="/static/js/common.js?v={:release()}"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>

View File

@@ -14,8 +14,30 @@
<div class="layui-nav layui-hide-xs fr" id="login">
<notempty name="$user.id"> <li class="layui-nav-item"><a class="" href="/index/user/index" >会员中心</a></li> <else/>
<li class="layui-nav-item"><a href="javascript:;" lay-open data-title="用户注册" data-area="490px" data-url="/index/user/register" >注册</a></li>
<li class="layui-nav-item"><a href="javascript:;" lay-open data-title="用户登录" data-area="450px,420px" data-url="/index/user/login" >登录</a></li>
<li class="layui-nav-item"><a href="/index/user/register" target="_blank">注册</a></li>
<li class="layui-nav-item"><a href="/index/user/login" target="_blank">登录</a></li>
<li class="layui-nav-item"><a id="ajaxLogin" href="javascript:;" lay-open data-title="用户登录" data-area="450px,420px" data-url="/index/user/ajaxLogin" >Ajax登录</a></li>
</notempty>
</div>
</div>
</div>
<script >
layui.use([], function(e) {
var $ = layui.jquery;
var layer = layui.layer;
//监听导航点击
$('#ajaxLogin').on('click', function() {
var url = $(this).attr('data-url');
var title = $(this).attr('data-title');
var area = $(this).attr('data-area');
layer.open({
type: 2,
title: title,
area: ['450px','420px'],
shadeClose: true, //点击遮罩关闭
content: url
});
});
})
</script>

View File

@@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{$site_name} 用户登录</title>
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta name="applicable-device" content="pc,mobile">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<script src="/static/js/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/font-awesome.css" />
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/layui.css" />
<link rel="stylesheet" type="text/css" href="/static/css/login.css" />
<script src="/static/js/center.js?v={:release()}"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
</head>
<body>
<div id="ajaxLogin" >
<div class="other-link">
<span class="other">第三方账号登录:</span>
<span>
<a href="{:url('/third/login',['type'=>'qq'])}&ref={$referer}" class="qq" target="_top"></a>
<a href="{:url('/third/login',['type'=>'weixin'])}&ref={$referer}" class="wx" target="_top"></a>
<a href="{:url('/third/login',['type'=>'weibo'])}&ref={$referer}" class="sina" target="_top"></a>
</span>
</div>
<form class="layui-form" action="/index/user/login" method="post" style="height: auto">
<input type="hidden" name="__token__" value="{:token()}"/>
<div class="layui-form-item">
<div class="item">
<label class="left-icon layui-icon layui-icon-username"></label>
<input type="text" id="nickname" name="nickname" lay-verify="required" placeholder="{:__('请输入账号或邮箱')}" class="layui-input" value="test@swiftadmin.net">
</div>
</div>
<div class="layui-form-item">
<div class="item">
<label class="left-icon layui-icon layui-icon-password"></label>
<input type="password" id="pwd" name="pwd" lay-verify="required" placeholder="{:__('密码')}" class="layui-input" value="admin888">
</div>
</div>
<div class="layui-form-item" style="margin-bottom: 20px;">
<div class="fl">
<input type="checkbox" name="remember" lay-skin="primary" title="{:__('记住密码')}" checked>
</div>
<a lay-open data-title="找回密码" data-area="500px,320px" data-object="top" data-url="/index/user/forgot"
class="forgot-link fr" style="margin-top: 7px;">{:__('忘记密码?')}</a>
</div>
<div class="layui-form-item">
<input type="submit" value="{:__('立即登录')}" lay-submit="" lay-filter="submitIframe" data-reload="top"
class="layui-btn layui-btn-login layui-btn-fluid layui-btn-normal">
</div>
</form>
</div>
</body>
</html>

View File

@@ -74,7 +74,7 @@
<div class="contract-title">手机</div>
<div class="contract-detail">+86 {$user.mobile|default='未绑定'}
<i class="layui-icon fa-edit" title="编辑" lay-open data-title="修改手机"
data-url="/index/user/mobile" data-area="500px,300px"></i>
data-url="/index/user/changeMobile" data-area="500px,300px"></i>
</div>
</div>
@@ -87,7 +87,7 @@
<div class="contract-title">办公室邮箱</div>
<div class="contract-detail">{$user.email|default='member@domain.com'}
<i class="layui-icon fa-edit" title="编辑" lay-open data-title="修改邮箱"
data-url="/index/user/email" data-area="500px,300px"></i>
data-url="/index/user/changeEmail" data-area="500px,300px"></i>
</div>
</div>
<div class="layui-col-md3">
@@ -242,7 +242,7 @@
<li>
<a title="{$vo.nickname}" href="#" target="_blank">
<img class="media-object" src="{$vo.avatar}"></a>
<a class="truncate" href="{$vo.url}" target="_blank">{$vo.nickname}</a>
<a class="truncate" href="{$vo.url|default='#'}" target="_blank">{$vo.nickname}</a>
</li>
</volist>
</ul>

View File

@@ -1,79 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>修改密码</title>
<include file="user:include"/>
</head>
<body>
<div class="layui-card-body">
<form action="/index/user/changePwd" class="layui-form layui-form-fixed">
<input type="text" name="nickname" value="{$user.nickname}" hidden="">
<div class="layui-form-item">
<label class="layui-form-label">原密码</label>
<div class="layui-input-block">
<input type="password" id="oldpwd" name="oldpwd" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">新密码</label>
<div class="layui-input-block">
<input type="password" id="pwd" name="pwd" class="layui-input" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-block">
<input type="password" id="repwd" name="repwd" class="layui-input" >
</div>
</div>
<div class="layui-form-item" style="margin-top: 22px;text-align: center;">
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button type="submit" class="layui-btn layui-btn-normal" lay-submit="" lay-filter="submit">立即提交</button>
</div>
</form>
</div>
<script>
layui.use(['jquery','form'],function(){
let $ = layui.jquery;
let form = layui.form;
//监听提交
form.on('submit(submit)', function(data){
if($("#pwd").val().length < 6){
layer.tips('请至少输入6个字符作为密码',"#pwd",{'tips':3});
return false;
}
if ($("#pwd").val() !== $("#repwd").val()) {
layer.tips('两次输入的密码不一样!',"#repwd",{'tips':3});
return false;
}
$.ajax({
url: $(this).attr('action'),
type: 'POST',
dataType: 'json',
timeout: 6000,
data: data.field,
success: function(res){
if (res.code === 200) {
top.layer.msg(res.msg);
}
else {
top.layer.msg(res.msg,'error');
}
}
});
return false;
});
})
</script>
</body>
</html>

View File

@@ -1,32 +0,0 @@
<layout name="layout:layout"/>
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-fluid ">
<form class="layui-form layui-form-fixed" action="/index/user/email">
<div class="layui-form-item">
<label class="layui-form-label">{:__('邮箱地址')}</label>
<div class="layui-input-inline" style="width: 265px">
<input name="email" placeholder="{:__('请输入邮箱地址')}" type="text" class="layui-input email"
autocomplete="off" lay-verify="required|email"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{:__('验证码')}</label>
<div class="layui-input-inline">
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input"
autocomplete="off" lay-verify="required" maxlength="10"/>
</div>
<button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-ajax data-url="/index/user/email"
data-object="email:email,event:event">{:__('获取')}
</button>
</div>
<input type="text" hidden name="event" class="event" value="change">
<div class="layui-footer layui-form-item layui-center">
<button class="layui-btn layui-btn-primary" type="button" sa-event="closeDialog">{:__('取消')}</button>
<button class="layui-btn layui-btn-normal" data-reload="parent" lay-filter="submitIframe" lay-submit>{:__('提交')}</button>
</div>
</form>
</div>
</div>

View File

@@ -1,86 +1,89 @@
<!DOCTYPE html>
<html lang="zh-CN">
<html>
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 用户登录</title>
<include file="public:header"/>
<title>{$site_name} 找回密码</title>
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta name="applicable-device" content="pc,mobile">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<script src="/static/js/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/font-awesome.css" />
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/layui.css" />
<link rel="stylesheet" type="text/css" href="/static/css/login.css" />
<script src="/static/js/center.js?v={:release()}"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
</head>
<body>
<style>
.layui-form-checked[lay-skin="primary"] i {
border-color: #1890ff !important;
background-color: #1890ff;
color: #fff;
}
.layui-form-item {
margin-bottom: 25px;
}
.red {
color: red;
}
.layui-input:hover {
border: 1px solid #1890ff!important;
}
</style>
<div class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/index/user/forgot" method="post" >
<input type="hidden" name="__token__" value="{:token()}"/>
<form class="layui-form layui-form-fixed" action="/index/user/forgot" method="post">
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> {:__('手机/邮箱')}</label>
<div class="layui-input-inline" style="width: 306px">
<input id="string" name="mobile" placeholder="{:__('请输入邮箱或手机号')}" type="text" class="layui-input string"
autocomplete="off" lay-verify="required"/>
<input id="name" name="name" placeholder="{:__('请输入邮箱或手机号')}" type="text" class="layui-input"
lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> {:__('验证码')}</label>
<div class="layui-input-inline">
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input" autocomplete="off" lay-verify="required" maxlength="10"/>
<div class="layui-input-inline" style="width: 226px">
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input"
autocomplete="off" lay-verify="required" maxlength="10"/>
</div>
<button id="send" class="layui-btn layui-btn-normal" type="button"
lay-ajax data-url="/ajax/smsSend" data-object="mobile:string,event:event">{:__('获取')}
<button id="uCode" class="layui-btn layui-btn-normal" type="button">{:__('获取')}
</button>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> {:__('新密码')}</label>
<div class="layui-input-inline" style="width: 306px">
<input type="password" id="pwd" name="pwd" lay-verify="required" placeholder="{:__('密码')}" class="layui-input" >
<input type="password" id="pwd" name="pwd" lay-verify="required" placeholder="{:__('密码')}"
class="layui-input">
</div>
</div>
<input type="text" hidden name="event" class="event" value="forgot">
<div class="layui-footer layui-form-item layui-center">
<button class="layui-btn layui-btn-primary" type="button" sa-event="closeDialog">{:__('取消')}</button>
<button class="layui-btn layui-btn-normal" lay-filter="submitIframe" lay-submit>{:__('提交')}</button>
<button class="layui-btn layui-btn-normal" lay-filter="submitIframe" lay-submit>{:__('提交')}</button>
</div>
</form>
</div>
</body>
<script>
layui.use('jquery', function() {
layui.use('jquery', function () {
let $ = layui.jquery;
$('#string').on('keyup',function (e) {
let val = $(this).val();
let string = $('#string');
let send = $('#send');
let regx = /^[1][3,4,5,6.7,8,9][0-9]{9}$/
if (regx.test(val)) {
string.attr('name','mobile');
send.attr('data-object','mobile:string,event:event');
send.attr('data-url','/ajax/smsSend');
} else {
string.attr('name','email');
send.attr('data-object','email:string,event:event');
send.attr('data-url','/ajax/emailsend');
$('#uCode').click(function (e) {
let name = $('#name').val();
if (name === '') {
layer.msg('请输入邮箱或手机号', 'info');
return false;
}
})
let regUrl = '/api/ajax/smsSend';
let data = { mobile: name };
let regxEmail = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
if (regxEmail.test(name)) {
regUrl = '/api/ajax/emailSend';
data = { email: name };
}
data.event = 'forgot';
$(this).attr('disabled', true);
$.ajax({
url: regUrl,
type: 'post',
data: data,
dataType: 'json',
success: function (res) {
if (res.code === 200) {
layer.msg(res.msg, 'success');
} else {
layer.msg(res.msg, 'error');
}
}
});
setTimeout(function () {
$('#uCode').attr('disabled', false);
}, 10000);
});
})
</script>
</html>

View File

@@ -1,40 +0,0 @@
<div class="layui-header">
<div class="layui-logo layui-hide-xs layui-bg-black">
<span class="logo-text">SAPHP <span style="font-size: medium ">用户后台</span></span>
</div>
<!-- 头部区域可配合layui 已有的水平导航) -->
<ul class="layui-nav layui-layout-left">
<!-- 移动端显示 -->
<li class="layui-nav-item layui-show-xs-inline-block" lay-header-event="menuLeft">
<i class="layui-icon layui-icon-spread-left"></i>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item" lay-unselect="">
<a href="{$site_http}" lay-text="主页">
<i class="layui-icon layui-icon-website"></i>
</a>
</li>
<li class="layui-nav-item" lay-unselect="">
<a href="javascript:;" sa-event="message" lay-text="消息中心" data-url="/admin.php/system.admin/message">
<i class="layui-icon fa-bell-o"></i>
<!-- 如果有新消息,则显示小圆点 -->
<span class="layui-badge-dot"></span>
</a>
</li>
<li class="layui-nav-item layui-hide layui-show-md-inline-block">
<a href="javascript:;"><img src="{$user.avatar}" alt="{$user.nickname}" class="layui-nav-img">{$user.nickname}</a>
<dl class="layui-nav-child">
<dd><a lay-open lay-title="修改密码" lay-url="/index/user/changepwd" lay-area="470px,330px" href="javascript:;">修改密码</a>
</dd>
<dd><a href="/index/user/logout" >退出</a></dd>
</dl>
</li>
<li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
<a href="javascript:;"><i class="layui-icon layui-icon-more-vertical"></i></a>
</li>
</ul>
</div>

View File

@@ -9,7 +9,7 @@
<link href="/static/js/layui/css/font-awesome.css?v={:config('app.version')}" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="/static/css/center.css?v={:release()}">
<script src="/static/js/layui/layui.js"></script>
<script src="/static/js/common.js?v={:release()}"></script>
<script src="/static/js/center.js?v={:release()}"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>

View File

@@ -1,62 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 用户登录</title>
<include file="public:header"/>
</head>
<body>
<style>
.layui-form-checked[lay-skin="primary"] i {
border-color: #1890ff !important;
background-color: #1890ff;
color: #fff;
}
.forget-link {
margin-top: 7px;
color: #1890ff;
}
</style>
<div id="userLogin" class="layui-fluid">
<div class="login-link">
<span class="other">第三方账号登录:</span>
<span>
<a href="{:url('/third/login',['type'=>'qq'])}&ref={$referer}" class="qq" target="_top"></a>
<a href="{:url('/third/login',['type'=>'weixin'])}&ref={$referer}" class="wx" target="_top"></a>
<a href="{:url('/third/login',['type'=>'weibo'])}&ref={$referer}" class="sina" target="_top"></a>
</span>
</div>
<form class="layui-form" action="/index/user/login" method="post" style="height: auto">
<input type="hidden" name="__token__" value="{:token()}"/>
<div class="layui-form-item">
<div class="item">
<label class="user-login-icon layui-icon layui-icon-username"></label>
<input type="text" id="nickname" name="nickname" lay-verify="required|email"
placeholder="{:__('请输入邮箱或手机号')}" class="layui-input" value="test@swiftadmin.net">
</div>
</div>
<div class="layui-form-item">
<div class="item">
<label class="user-login-icon layui-icon layui-icon-password"></label>
<input type="password" id="pwd" name="pwd" lay-verify="required" placeholder="{:__('密码')}"
class="layui-input" value="admin888">
</div>
</div>
<div class="layui-form-item" style="margin-bottom: 20px;">
<div class="fl">
<input type="checkbox" name="remember" lay-skin="primary" title="{:__('记住密码')}" checked>
</div>
<a lay-open data-title="找回密码" data-area="510px,360px" data-object="top" data-url="/index/user/forgot" class="forget-link fr" style="margin-top: 7px;">{:__('忘记密码?')}</a>
</div>
<div class="layui-form-item">
<input type="submit" value="{:__('立即登录')}" lay-submit="" lay-filter="submitIframe" data-reload="top"
class="layui-btn layui-btn-fluid layui-btn-normal">
</div>
</form>
</div>
</body>
</html>

View File

@@ -19,7 +19,7 @@
*/
var isTable = table.render({
elem: "#lay-tableList"
, url: "{:url('/user/login_log')}"
, url: "{:url('/user/loginLog')}"
, page: true
, limit: 20
, cols: [[

View File

@@ -17,8 +17,8 @@
<button class="layui-btn layui-btn-normal layui-btn-sm layui-btn-post" data-status="all" >{:__('全部消息')}</button>
<button class="layui-btn layui-btn-primary layui-btn-sm layui-btn-post" data-status="1">{:__('已读消息')}</button>
<button class="layui-btn layui-btn-primary layui-btn-sm layui-btn-post" data-status="0">{:__('未读消息')}</button>
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-batch data-table="lay-tableList" data-url="/index/user/dermessage?type=del" >{:__('删除消息')}</button>
<button class="layui-btn layui-btn-checked layui-btn-sm" lay-batch data-table="lay-tableList" data-url="/index/user/dermessage?type=read" >{:__('标记已读')}</button>
<button class="layui-btn layui-btn-danger layui-btn-sm" lay-batch data-table="lay-tableList" data-url="/index/user/batchMessage?type=del" >{:__('删除消息')}</button>
<button class="layui-btn layui-btn-checked layui-btn-sm" lay-batch data-table="lay-tableList" data-url="/index/user/batchMessage?type=read" >{:__('标记已读')}</button>
</div>
</div>
</div>
@@ -45,14 +45,14 @@
, page: true
, limit: 20
, cols: [[
{type: 'checkbox', width: 45},
{type: 'checkbox', width: 60},
{
field: 'title', align: 'left', templet: function (e) {
let title = '<a class="layui-table-text';
if (e.status === 0) {
title += ' layui-table-text-red';
}
title += '" lay-open data-title="查看消息" data-url="/index/user/viewmessage?id=' + e.id + '" data-area="600px, 390px" >';
title += '" lay-open data-title="查看消息" data-url="/index/user/viewMessage?id=' + e.id + '" data-area="600px, 390px" >';
if (e.status === 0) {
title += '<i class="layui-icon fa-envelope"></i> ';
} else {

View File

@@ -1,30 +0,0 @@
<layout name="layout:layout"/>
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/index/user/mobile">
<div class="layui-form-item">
<label class="layui-form-label">{:__('手机号')}</label>
<div class="layui-input-inline" style="width: 265px">
<input name="mobile" placeholder="{:__('请输入号码')}" type="text" class="layui-input mobile"
autocomplete="off" lay-verify="required|phone"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{:__('验证码')}</label>
<div class="layui-input-inline">
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input"
autocomplete="off" lay-verify="required" maxlength="10"/>
</div>
<button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-ajax data-url="/index/user/mobile"
data-object="mobile:mobile,event:event">{:__('获取')}
</button>
</div>
<input type="text" hidden name="event" class="event" value="change">
<div class="layui-footer layui-form-item layui-center">
<button class="layui-btn layui-btn-primary" type="button" sa-event="closeDialog">{:__('取消')}</button>
<button class="layui-btn layui-btn-normal" data-reload="parent" lay-filter="submitIframe" lay-submit>{:__('提交')}</button>
</div>
</form>
</div>
</div>

View File

@@ -1,35 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>消息管理 | {$site_name}</title>
<include file="user:include" />
</head>
<body>
<div class="layui-layout layui-layout-admin">
<include file="user:header" />
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<include file="user:userNav" />
</div>
</div>
<div class="layui-body">
<!-- 内容主体区域 -->
<div id="content">
<h1>消息 示例页面</h1>
</div>
</div>
<include file="user:footer"/>
</div>
</body>
</html>
</body>
</html>

View File

@@ -2,85 +2,125 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 用户注册</title>
<include file="public:header"/>
<title>{$site_name} 用户注册</title>
<meta http-equiv="Cache-Control" content="no-transform"/>
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<meta name="applicable-device" content="pc,mobile">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<script src="/static/js/layui/layui.js"></script>
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/font-awesome.css"/>
<link rel="stylesheet" type="text/css" href="/static/js/layui/css/layui.css"/>
<link rel="stylesheet" type="text/css" href="/static/css/login.css"/>
<script src="/static/js/center.js?v={:release()}"></script>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
</head>
<body>
<style>
<div id="content" class="userLogin layui-fluid">
.layui-form-item {
margin-bottom: 15px;
}
<div class="form-header">
<i class="layui-icon fa-user-plus"></i>
<h6>用户注册</h6>
</div>
<div class="formLogin active">
.red {
color: red;
}
.layui-input:hover {
border: 1px solid #1890ff !important;
}
</style>
<div id="register" class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/index/user/register" method="post">
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 用户帐号</label>
<div class="layui-input-block">
<input type="text" name="nickname" placeholder="请输入帐号" class="layui-input">
<form class="layui-form mobileLogin" action="/index/user/register" method="post">
<div class="layui-form-item item-input">
<input type="text" id="nickname" name="nickname" lay-verify="required" data-title="账号"
placeholder="{:__('请输入登录账号')}" class="inputStyle" value="">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 密码</label>
<div class="layui-input-block">
<input type="password" id="pwd" name="pwd" placeholder="请输入密码" class="layui-input">
<div class="layui-form-item item-input">
<input type="password" id="pwd" name="pwd" lay-verify="required" data-title="密码" maxlength="32"
placeholder="{:__('请输入密码')}" class="inputStyle" value="">
<span class="fr-icon visiblePwd"><i class="layui-icon fa-eye-slash"></i></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 确认密码</label>
<div class="layui-input-block">
<input type="password" id="repwd" name="repwd" placeholder="请输入确认密码" class="layui-input">
</div>
</div>
<eq name="style" value="mobile">
<div class="layui-form-item item-input">
<input type="password" id="pwd2" lay-verify="required" data-title="密码" maxlength="32"
placeholder="{:__('请输入确认密码')}" class="inputStyle" value="">
<span class="fr-icon visiblePwd"><i class="layui-icon fa-eye-slash"></i></span>
</div>
<eq name="style" value="mobile">
<div class="layui-form-item item-input">
<input type="text" id="mobile" name="mobile" lay-verify="required" data-title="手机号"
placeholder="{:__('请输入手机号码')}" class="inputStyle mobile" value="">
</div>
<div class="layui-form-item item-input">
<input type="text" id="captcha" name="captcha" lay-verify="required" data-title="验证码"
maxlength="6"
placeholder="{:__('短信验证码')}" class="inputStyle" value="">
<input type="text" hidden name="event" class="event" value="login">
<span class="fr-icon getCaptcha" lay-ajax data-url="/api/ajax/smsSend"
data-object="mobile:mobile,event:event">获取验证码</span>
</div>
<else/>
<div class="layui-form-item item-input">
<input type="text" name="email" lay-verify="require|email" placeholder="请输入邮箱" class="inputStyle">
</div>
</eq>
<input type="hidden" id="token" name="__token__" value="{:token()}"/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 手机号</label>
<div class="layui-input-block">
<input type="text" id="mobile" name="mobile" placeholder="请输入手机号" lay-verify="require|phone"
class="layui-input mobile">
<div class="fl">
<input type="checkbox" name="remember" lay-skin="primary" title="{:__('记住密码')}" checked>
</div>
<div class="fr">
<a href="/index/user/login" class="forgot-link" style="margin-top: 7px;">{:__('返回登录')}</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 验证码</label>
<div class="layui-input-block">
<input type="text" name="captcha" placeholder="{:__('验证码')}" class="layui-input captcha">
<div class="captcha fr">
<button id="captcha" type="button" class="layui-btn layui-btn-normal"
lay-ajax data-url="/ajax/smsSend" data-object="mobile:mobile,event:event"
>获取验证码
</button>
</div>
</div>
<button class="layui-btn layui-btn-login layui-btn-fluid layui-btn-normal"
lay-filter="submitIframe" data-reload="top" lay-submit>{:__('立即注册')}</button>
</div>
<else/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 邮箱地址</label>
<div class="layui-input-block">
<input type="text" name="email" lay-verify="require|email" placeholder="请输入邮箱" class="layui-input">
</div>
<div class="agreement">
<span>未注册手机验证后自动登录,注册即代表同意<a href="#">《用户协议》</a>以及网站<a href="#">《隐私保护指引》</a></span>
</div>
</eq>
</form>
</div>
<input type="text" hidden name="event" class="event" value="register">
<div class="layui-footer layui-form-item layui-center">
<button class="layui-btn layui-btn-primary" type="button" sa-event="closeDialog">{:__('取消')}</button>
<button class="layui-btn layui-btn-normal" lay-filter="submitIframe" data-reload="top" lay-submit>
{:__('立即注册')}
</button>
<div class="loginLine"></div>
<div class="appUserDown">
<div class="fr">
<a class="link" href="#" target="_top">
<span>
<i class="layui-icon fa-apple"></i>
<i class="layui-icon fa-android"></i>
<i class="layui-icon fa-windows"></i>
<span class="tit">下载 APP</span>
</span>
</a>
</div>
</form>
</div>
</div>
</body>
<script>
layui.use(['jquery'], function (e) {
let $ = layui.jquery;
let layer = layui.layer;
$('#pwd, #pwd2').blur(function(e) {
let v1 = $('#pwd').val();
let v2 = $('#pwd2').val();
let v3 = v1 && v2 && (v1 !== v2);
v3 && layer.msg('密码不相同');
$('.layui-btn-login').attr('disabled', v3);
})
/* 显示隐藏密码 */
$('.visiblePwd').click(function() {
// 获取我同级上面得input元素
let elem = $(this).prev('input');
let type = $(elem).attr('type');
if (type === 'password') {
$(elem).attr('type','text');
$(this).find('i.layui-icon').addClass('fa-eye').removeClass('fa-eye-slash');
} else {
$(elem).attr('type','password');
$(this).find('i.layui-icon').addClass('fa-eye-slash').removeClass('fa-eye');
}
});
});
</script>
</html>

View File

@@ -60,7 +60,7 @@
<span class="setting-intro">安全性高的密码可以使账户更安全;互联网账号存在被盗风险,建议您定期更换密码</span>
</div>
<div class="setting-operate fr">
<a lay-open="" data-title="修改密码" data-url="/index/user/changepwd" data-area="470px,330px" href="javascript:;">修改</a>
<a lay-open="" data-title="修改密码" data-url="/index/user/changePwd" data-area="470px,330px" href="javascript:;">修改</a>
</div>
</div>
@@ -84,7 +84,7 @@
</div>
<div class="setting-operate fr">
<a lay-open data-title="修改手机" data-url="/index/user/mobile" data-area="500px,300px">修改</a>
<a lay-open data-title="修改手机" data-url="/index/user/changeMobile" data-area="500px,300px">修改</a>
</div>
</div>
@@ -108,7 +108,7 @@
</div>
<div class="setting-operate fr">
<a lay-open data-title="修改邮箱" data-url="/index/user/email" data-area="500px,300px">修改</a>
<a lay-open data-title="修改邮箱" data-url="/index/user/changeEmail" data-area="500px,300px">修改</a>
</div>
</div>

View File

@@ -15,7 +15,7 @@
<dl class="layui-nav-child">
<dd><a lay-href="/index/user/profile">我的资料</a></dd>
<dd><a lay-href="/index/user/message">站内消息</a></dd>
<dd><a lay-href="/index/user/login_log">登录日志</a></dd>
<dd><a lay-href="/index/user/loginLog">登录日志</a></dd>
<dd><a lay-href="/index/user/certification">实名认证</a></dd>
<dd><a lay-href="/index/user/security">安全中心</a></dd>
</dl>