提交 252bee07 编写于 作者: D devil_gong

新增ucenter应用

上级 f5d23e2e
......@@ -11,6 +11,27 @@
// 应用公共文件
/**
* 生成随机字符串
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-04
* @desc description
* @param [int] $length [长度 默认6]
*/
function RandomString($length = 6)
{
$pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
$pattern_length = strlen($pattern)-1;
$output = '';
for($i=0; $i<$length; $i++)
{
$output .= $pattern[mt_rand(0, $pattern_length)];
}
return $output;
}
/**
* each函数
* @author Devil
......
......@@ -441,8 +441,15 @@ class User extends Common
*/
public function Logout()
{
session('user', null);
return redirect(__MY_URL__);
// 调用服务层
$ret = UserService::Logout();
// 登录返回
$body_html = (!empty($ret['data']['body_html']) && is_array($ret['data']['body_html'])) ? implode(' ', $ret['data']['body_html']) : $ret['data']['body_html'];
$this->assign('body_html', $body_html);
$this->assign('msg', $ret['msg']);
return $this->fetch();
}
/**
......
......@@ -16,7 +16,7 @@
<div class="am-g my-content">
<div class="am-u-md-6 am-u-sm-centered">
<!-- form start -->
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/reg')}}" request-type="ajax-url" request-value="{{$referer_url}}">
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/reg')}}" request-type="ajax-fun" request-value="RegisterSuccessBack">
<fieldset>
{{if MyC('home_user_login_state') eq 1}}
<span>已有帐号?</span>
......@@ -101,4 +101,31 @@
</div>
<!-- conntent end -->
{{include file="public/footer" /}}
\ No newline at end of file
{{include file="public/footer" /}}
<script type="text/javascript">
// 注册成功回调
function RegisterSuccessBack(e)
{
if(e.code == 0)
{
$.AMUI.progress.done();
Prompt(e.msg, 'success');
// 登录返回html处理
if((e.data.body_html || null) != null)
{
$('body').append(e.data.body_html);
}
setTimeout(function()
{
window.location.href = '{{$referer_url}}';
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
$.AMUI.progress.done();
Prompt(e.msg);
}
}
</script>
\ No newline at end of file
......@@ -16,7 +16,7 @@
<div class="am-g my-content">
<div class="am-u-md-6 am-u-sm-centered">
<!-- form start -->
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/login')}}" request-type="ajax-url" request-value="{{$referer_url}}">
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/login')}}" request-type="ajax-fun" request-value="LoginSuccessBack">
<fieldset>
{{if in_array('sms', MyC('home_user_reg_state')) or in_array('email', MyC('home_user_reg_state'))}}
<span class="">还没有帐号?</span>
......@@ -39,8 +39,8 @@
<hr />
<div class="am-form-group am-form-group-refreshing">
<label>手机/邮箱</label>
<input type="text" name="accounts" class="am-radius" minlength="1" placeholder="手机/邮箱" data-validation-message="手机/邮箱格式有误" required />
<label>登录账号</label>
<input type="text" name="accounts" class="am-radius" minlength="1" placeholder="用户名/手机/邮箱" data-validation-message="请填写登录账号" required />
</div>
<div class="am-form-group am-form-group-refreshing">
......@@ -59,5 +59,31 @@
</div>
<!-- conntent end -->
{{include file="public/footer" /}}
{{include file="public/footer" /}}
\ No newline at end of file
<script type="text/javascript">
// 登录成功回调
function LoginSuccessBack(e)
{
if(e.code == 0)
{
$.AMUI.progress.done();
Prompt(e.msg, 'success');
// 登录返回html处理
if((e.data.body_html || null) != null)
{
$('body').append(e.data.body_html);
}
setTimeout(function()
{
window.location.href = '{{$referer_url}}';
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
$.AMUI.progress.done();
Prompt(e.msg);
}
}
</script>
\ No newline at end of file
{{include file="public/header" /}}
<!-- header nav start -->
{{if isset($is_header) and $is_header eq 1}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
{{/if}}
<!-- header nav end -->
<!-- conntent start -->
<div class="am-g my-content">
<div class="am-u-md-6 am-u-sm-centered">
<div class="am-panel am-radius tips-success">
<div class="am-panel-bd">
<i class="am-icon-check-circle am-icon-sm"></i>
<span class="msg">{{$msg}}</span>
<div class="tips-nav">
<a href="{{$Think.__MY_URL__}}" class="am-btn am-btn-secondary am-radius">回到首页</a>
</div>
</div>
</div>
</div>
</div>
<!-- conntent end -->
{{include file="public/footer" /}}
{{if !empty($body_html)}}
{{$body_html|raw}}
{{/if}}
<script type="text/javascript">
setTimeout(function()
{
window.location.href = '{{$Think.__MY_URL__}}';
}, 1500);
</script>
\ No newline at end of file
......@@ -27,8 +27,8 @@
<hr />
<div class="am-form-group am-form-group-refreshing">
<label>手机/邮箱</label>
<input type="text" name="accounts" class="am-radius" minlength="1" placeholder="手机/邮箱" data-validation-message="手机/邮箱格式有误" required />
<label>登录账号</label>
<input type="text" name="accounts" class="am-radius" minlength="1" placeholder="用户名/手机/邮箱" data-validation-message="请填写登录账号" required />
</div>
<div class="am-form-group am-form-group-refreshing">
......@@ -57,9 +57,16 @@
{
$.AMUI.progress.done();
Prompt(e.msg, 'success');
// 登录返回html处理
if((e.data.body_html || null) != null)
{
$('body').append(e.data.body_html);
}
setTimeout(function()
{
parent.location.reload();
window.parent.location.reload();
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
......@@ -67,4 +74,5 @@
Prompt(e.msg);
}
}
</script>
\ No newline at end of file
</script>
......@@ -16,7 +16,7 @@
<div class="am-g my-content">
<div class="am-u-md-6 am-u-sm-centered">
<!-- form start -->
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/reg')}}" request-type="ajax-url" request-value="{{$referer_url}}">
<form class="am-form form-validation" method="post" action="{{:MyUrl('index/user/reg')}}" request-type="ajax-fun" request-value="RegisterSuccessBack">
<fieldset>
{{if MyC('home_user_login_state') eq 1}}
<span>已有帐号?</span>
......@@ -100,4 +100,31 @@
</div>
<!-- conntent end -->
{{include file="public/footer" /}}
\ No newline at end of file
{{include file="public/footer" /}}
<script type="text/javascript">
// 注册成功回调
function RegisterSuccessBack(e)
{
if(e.code == 0)
{
$.AMUI.progress.done();
Prompt(e.msg, 'success');
// 登录返回html处理
if((e.data.body_html || null) != null)
{
$('body').append(e.data.body_html);
}
setTimeout(function()
{
window.location.href = '{{$referer_url}}';
}, 1500);
} else {
$('form.form-validation').find('button[type="submit"]').button('reset');
$.AMUI.progress.done();
Prompt(e.msg);
}
}
</script>
\ No newline at end of file
......@@ -309,7 +309,7 @@ return array(
// 正则
// 用户名
'common_regex_username' => '^[A-Za-z0-9_]{5,18}$',
'common_regex_username' => '^[A-Za-z0-9_]{2,18}$',
// 用户名
'common_regex_pwd' => '^.{6,18}$',
......
......@@ -124,12 +124,10 @@ class Index extends Controller
$ret = Service::TouristReg();
if($ret['code'] == 0)
{
if(isset($params['is_parent']) && $params['is_parent'] == 1)
{
return '<script type="text/javascript">if(self.frameElement && self.frameElement.tagName == "IFRAME"){parent.location.reload();}else{window.location.href="'.__MY_URL__.'";}</script>';
} else {
return $this->redirect(__MY_URL__);
}
$this->assign('msg', $ret['msg']);
$this->assign('data', $ret['data']);
$this->assign('is_parent', isset($params['is_parent']) ? $params['is_parent'] : 0);
return $this->fetch('../../../plugins/view/touristbuy/index/success');
} else {
$this->assign('msg', $ret['msg']);
return $this->fetch('public/error');
......
......@@ -41,54 +41,54 @@ class Service
return DataReturn('已登录,请先退出', -1);
}
// 获取应用数据
$ret = PluginsService::PluginsData('touristbuy');
$nickname = empty($ret['data']['nickname']) ? '游客' : $ret['data']['nickname'];
// 是否重复注册
// 是否有登录纪录
$tourist_user_id = session('tourist_user_id');
if(!empty($tourist_user_id))
{
// 更新用户信息
$upd_data =[
'username' => $nickname,
'nickname' => $nickname,
'upd_time' => time(),
];
if(Db::name('User')->where(['id'=>$tourist_user_id])->update($upd_data))
$user = UserService::UserInfo('id', $tourist_user_id);
if(!empty($user))
{
// 用户登录session纪录
if(UserService::UserLoginRecord($tourist_user_id))
// 用户登录
$ret = UserService::Login(['accounts'=>$user['username'], 'pwd'=>$user['username']]);
if($ret['code'] == 0)
{
return DataReturn($nickname.'登录成功', 0);
return DataReturn('登录成功', 0, $ret['data']);
}
}
session('tourist_user_id', null);
}
// 获取应用数据
$ret = PluginsService::PluginsData('touristbuy');
$nickname = empty($ret['data']['nickname']) ? '游客' : $ret['data']['nickname'];
$nickname = $nickname.'-'.RandomString(6);
// 游客数据
$salt = GetNumberCode(6);
$data = [
'username' => $nickname,
'nickname' => $nickname,
'status' => 0,
'salt' => $salt,
'pwd' => LoginPwdEncryption($nickname, $salt),
'add_time' => time(),
'upd_time' => time(),
];
// 数据添加
$user_id = Db::name('User')->insertGetId($data);
if($user_id > 0)
$ret = UserService::UserInsert($data, ['nickname'=>$nickname, 'pwd'=>$nickname]);
if($ret['code'] == 0)
{
// 单独存储用户id
session('tourist_user_id', $user_id);
session('tourist_user_id', $ret['data']['user_id']);
// 用户登录session纪录
if(UserService::UserLoginRecord($user_id))
if(UserService::UserLoginRecord($ret['data']['user_id']))
{
return DataReturn($nickname.'登录成功', 0);
return DataReturn('登录成功', 0, $ret['data']);
}
}
return DataReturn($nickname.'登录失败', -100);
return DataReturn('登录失败', -100);
}
}
?>
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\plugins\ucenter;
use think\Controller;
use app\service\PluginsService;
/**
* UCenter - 后台管理
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class Admin extends Controller
{
/**
* 首页
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-07T08:21:54+0800
* @param [array] $params [输入参数]
*/
public function index($params = [])
{
$ret = PluginsService::PluginsData('ucenter');
if($ret['code'] == 0)
{
$ret['data']['login_sync_url'] = str_replace("\n", '<br />', $ret['data']['login_sync_url']);
$ret['data']['login_async_url'] = str_replace("\n", '<br />', $ret['data']['login_async_url']);
$ret['data']['register_sync_url'] = str_replace("\n", '<br />', $ret['data']['register_sync_url']);
$ret['data']['register_async_url'] = str_replace("\n", '<br />', $ret['data']['register_async_url']);
$ret['data']['logout_sync_url'] = str_replace("\n", '<br />', $ret['data']['logout_sync_url']);
$ret['data']['logout_async_url'] = str_replace("\n", '<br />', $ret['data']['logout_async_url']);
$ret['data']['loginpwdupdate_async_url'] = str_replace("\n", '<br />', $ret['data']['loginpwdupdate_async_url']);
$ret['data']['accounts_async_url'] = str_replace("\n", '<br />', $ret['data']['accounts_async_url']);
$this->assign('data', $ret['data']);
return $this->fetch('../../../plugins/view/ucenter/admin/index');
} else {
return $ret['msg'];
}
}
/**
* 编辑页面
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-07T08:21:54+0800
* @param [array] $params [输入参数]
*/
public function saveinfo($params = [])
{
$ret = PluginsService::PluginsData('ucenter');
if($ret['code'] == 0)
{
// 是否
$is_whether_list = [
0 => array('id' => 0, 'name' => '否', 'checked' => true),
1 => array('id' => 1, 'name' => '是'),
];
$this->assign('is_whether_list', $is_whether_list);
$this->assign('data', $ret['data']);
return $this->fetch('../../../plugins/view/ucenter/admin/saveinfo');
} else {
return $ret['msg'];
}
}
/**
* 数据保存
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-07T08:21:54+0800
* @param [array] $params [输入参数]
*/
public function save($params = [])
{
return PluginsService::PluginsDataSave(['plugins'=>'ucenter', 'data'=>$params]);
}
}
?>
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\plugins\ucenter;
use think\Db;
use app\service\UserService;
use app\service\SafetyService;
/**
* UCenter - Api
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class Api
{
/**
* 密码修改
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-09T14:25:44+0800
* @param [array] $params [输入参数]
*/
public function LoginPwdUpdate($params = [])
{
$user = empty($params['data']) ? '' : json_decode(htmlspecialchars_decode($params['data']), true);
$data = empty($params['params']) ? '' : json_decode(htmlspecialchars_decode($params['params']), true);
if(empty($user))
{
return json(DataReturn('用户信息为空', -400));
}
if(empty($data))
{
return json(DataReturn('参数为空', -401));
}
if(empty($data['accounts']) || empty($data['my_pwd']) || empty($data['new_pwd']) || empty($data['confirm_new_pwd']))
{
return json(DataReturn('账号或密码为空', -402));
}
// 用户信息
$where = array('username|mobile|email' => $data['accounts'], 'is_delete_time'=>0);
$temp = Db::name('User')->where($where)->find();
if(empty($temp))
{
return json(DataReturn('用户信息不存在', -402));
}
// 调用服务层
$salt = GetNumberCode(6);
$user_data = [
'accounts' => $data['accounts'],
'my_pwd' => $data['my_pwd'],
'new_pwd' => $data['new_pwd'],
'confirm_new_pwd' => $data['confirm_new_pwd'],
'user' => $temp,
];
$ret = SafetyService::LoginPwdUpdate($user_data);
return json(DataReturn($ret['msg'], $ret['code']));
}
/**
* 登录
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-09T14:25:44+0800
* @param [array] $params [输入参数]
*/
public function Login($params = [])
{
$user = empty($params['data']) ? '' : json_decode(htmlspecialchars_decode($params['data']), true);
$data = empty($params['params']) ? '' : json_decode(htmlspecialchars_decode($params['params']), true);
if(empty($user))
{
return json(DataReturn('用户信息为空', -400));
}
if(empty($data))
{
return json(DataReturn('参数为空', -401));
}
if(empty($data['accounts']) || empty($data['pwd']))
{
return json(DataReturn('账号或密码为空', -402));
}
// 调用服务层
$ret = UserService::Login($data);
return json(DataReturn($ret['msg'], $ret['code']));
}
/**
* 注册
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-09T14:25:44+0800
* @param [array] $params [输入参数]
*/
public function Register($params = [])
{
$user = empty($params['data']) ? '' : json_decode(htmlspecialchars_decode($params['data']), true);
$data = empty($params['params']) ? '' : json_decode(htmlspecialchars_decode($params['params']), true);
if(empty($user))
{
return json(DataReturn('用户信息为空', -400));
}
if(empty($data))
{
return json(DataReturn('参数为空', -401));
}
if(empty($data['accounts']) || empty($data['pwd']))
{
return json(DataReturn('账号或密码为空', -402));
}
// 用户注册数据
$salt = GetNumberCode(6);
$user_data = [
'username' => $data['accounts'],
'nickname' => $data['accounts'],
'email' => CheckEmail($data['accounts']) ? $data['accounts'] : '',
'mobile' => CheckMobile($data['accounts']) ? $data['accounts'] : '',
'salt' => $salt,
'pwd' => LoginPwdEncryption($data['pwd'], $salt),
];
// 调用服务层
$ret = UserService::UserInsert($user_data, $data);
if($ret['code'] == 0)
{
$ret = UserService::Login($data);
}
return json(DataReturn($ret['msg'], $ret['code']));
}
/**
* 退出
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-09T14:25:44+0800
* @param [array] $params [输入参数]
*/
public function Logout($params = [])
{
$user = empty($params['data']) ? '' : json_decode(htmlspecialchars_decode($params['data']), true);
if(empty($user))
{
return json(DataReturn('用户信息为空', -400));
}
// 调用服务层
$ret = UserService::Logout();
return json(DataReturn($ret['msg'], $ret['code']));
}
}
?>
\ No newline at end of file
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\plugins\ucenter;
use think\Controller;
use app\service\PluginsService;
/**
* UCenter - 钩子入口
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class Hook extends Controller
{
/**
* 应用响应入口
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @datetime 2019-02-09T14:25:44+0800
* @param [array] $params [输入参数]
*/
public function run($params = [])
{
if(!empty($params['hook_name']))
{
$config = PluginsService::PluginsData('ucenter');
if($config['code'] == 0)
{
$ret = DataReturn('无需处理', 0);
if(!empty($params['user']))
{
switch($params['hook_name'])
{
// 注册
case 'plugins_service_user_register_end' :
$ret = $this->RegisterEndHandle($config['data'], $params);
break;
// 登录
case 'plugins_service_user_login_end' :
$ret = $this->LoginEndHandle($config['data'], $params);
break;
// 登录密码修改
case 'plugins_service_user_login_pwd_update' :
$ret = $this->LoginPwdUpdateHandle($config['data'], $params);
break;
// 账号修改
case 'plugins_service_user_accounts_update' :
$ret = $this->AccountsUpdateHandle($config['data'], $params);
break;
}
}
// 退出
if(in_array($params['hook_name'], ['plugins_service_user_logout_handle']))
{
$ret = $this->LogoutEndHandle($config['data'], $params);
}
return $ret;
}
// 默认返回视图
} else {
return '';
}
}
/**
* 账号修改
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-02
* @desc description
* @param [array] $config [配置信息]
* @param [array] $params [输入参数]
*/
public function AccountsUpdateHandle($config = [], $params = [])
{
// 异步接口
if(!empty($config['accounts_async_url']))
{
$accounts_async_url = explode("\n", $config['accounts_async_url']);
if(!empty($accounts_async_url) && is_array($accounts_async_url))
{
foreach($accounts_async_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
SyncJob($url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])));
}
}
}
}
/**
* 登录密码修改
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-02
* @desc description
* @param [array] $config [配置信息]
* @param [array] $params [输入参数]
*/
public function LoginPwdUpdateHandle($config = [], $params = [])
{
// 异步接口
if(!empty($config['loginpwdupdate_async_url']))
{
$loginpwdupdate_async_url = explode("\n", $config['loginpwdupdate_async_url']);
if(!empty($loginpwdupdate_async_url) && is_array($loginpwdupdate_async_url))
{
foreach($loginpwdupdate_async_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
SyncJob($url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])));
}
}
}
}
/**
* 退出
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-02
* @desc description
* @param [array] $config [配置信息]
* @param [array] $params [输入参数]
*/
public function LogoutEndHandle($config = [], $params = [])
{
// 用户信息
$user = empty($params['user']) ? '' : $params['user'];
// 同步接口
if(!empty($config['logout_sync_url']))
{
$logout_sync_url = explode("\n", $config['logout_sync_url']);
if(!empty($logout_sync_url) && is_array($logout_sync_url))
{
foreach($logout_sync_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
$params['body_html'][] = '<script type="text/javascript" src="'.$url.$join.'data='.urlencode(json_encode($user)).'"></script>';
}
}
}
// 异步接口
if(!empty($config['logout_async_url']))
{
$logout_async_url = explode("\n", $config['logout_async_url']);
if(!empty($logout_async_url) && is_array($logout_async_url))
{
foreach($logout_async_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
SyncJob($url.$join.'data='.urlencode(json_encode($user)));
}
}
}
}
/**
* 注册
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-02
* @desc description
* @param [array] $config [配置信息]
* @param [array] $params [输入参数]
*/
public function RegisterEndHandle($config = [], $params = [])
{
// 同步接口
if(!empty($config['register_sync_url']))
{
$register_sync_url = explode("\n", $config['register_sync_url']);
if(!empty($register_sync_url) && is_array($register_sync_url))
{
foreach($register_sync_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
$params['body_html'][] = '<script type="text/javascript" src="'.$url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])).'"></script>';
}
}
}
// 异步接口
if(!empty($config['register_async_url']))
{
$register_async_url = explode("\n", $config['register_async_url']);
if(!empty($register_async_url) && is_array($register_async_url))
{
foreach($register_async_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
SyncJob($url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])));
}
}
}
}
/**
* 登录
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-02
* @desc description
* @param [array] $config [配置信息]
* @param [array] $params [输入参数]
*/
public function LoginEndHandle($config = [], $params = [])
{
// 同步接口
if(!empty($config['login_sync_url']))
{
$login_sync_url = explode("\n", $config['login_sync_url']);
if(!empty($login_sync_url) && is_array($login_sync_url))
{
foreach($login_sync_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
$params['body_html'][] = '<script type="text/javascript" src="'.$url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])).'"></script>';
}
}
}
// 异步接口
if(!empty($config['login_async_url']))
{
$login_async_url = explode("\n", $config['login_async_url']);
if(!empty($login_async_url) && is_array($login_async_url))
{
foreach($login_async_url as $url)
{
$join = (stripos($url, '?') === false) ? '?' : '&';
SyncJob($url.$join.'data='.urlencode(json_encode($params['user'])).'&params='.urlencode(json_encode($params['params'])));
}
}
}
}
}
?>
\ No newline at end of file
{
"base":{
"plugins":"ucenter",
"name":"UCenter",
"logo":"\/static\/upload\/images\/plugins_ucenter\/2019\/04\/02\/1554185833720976.jpg",
"author":"Devil",
"author_url":"https:\/\/shopxo.net\/",
"version":"1.0.0",
"desc":"同步用户登录、注册、密码修改、账号修改",
"apply_terminal":[
"pc",
"h5"
],
"apply_version":[
"1.4.0"
],
"is_home":false
},
"hook":{
"plugins_service_user_login_end":[
"app\\plugins\\ucenter\\Hook"
],
"plugins_service_user_register_end":[
"app\\plugins\\ucenter\\Hook"
],
"plugins_service_user_logout_handle":[
"app\\plugins\\ucenter\\Hook"
],
"plugins_service_user_login_pwd_update":[
"app\\plugins\\ucenter\\Hook"
],
"plugins_service_user_accounts_update":[
"app\\plugins\\ucenter\\Hook"
]
}
}
\ No newline at end of file
{{include file="public/header" /}}
<!-- header nav start -->
{{if isset($is_header) and $is_header eq 1}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
{{/if}}
<!-- header nav end -->
<!-- conntent start -->
<div class="am-g my-content">
<div class="am-u-md-6 am-u-sm-centered">
<div class="am-panel am-radius tips-success">
<div class="am-panel-bd">
<i class="am-icon-check-circle am-icon-sm"></i>
<span class="msg">{{$msg}}</span>
<div class="tips-nav">
<a href="{{$Think.__MY_URL__}}" class="am-btn am-btn-secondary am-radius">回到首页</a>
</div>
</div>
</div>
</div>
</div>
<!-- conntent end -->
{{include file="public/footer" /}}
{{if !empty($data['body_html'])}}
{{$data.body_html|raw}}
{{/if}}
<script type="text/javascript">
{{if isset($is_parent) and $is_parent eq 1}}
setTimeout(function()
{
if(self.frameElement && self.frameElement.tagName == "IFRAME")
{
parent.location.reload();
}else{
window.location.href='{{$Think.__MY_URL__}}';
}
}, 1500);
{{else /}}
setTimeout(function()
{
window.location.href='{{$Think.__MY_URL__}}';
}, 1500);
{{/if}}
</script>
\ No newline at end of file
{{include file="public/header" /}}
<!-- right content start -->
<div class="content-right">
<div class="content">
<legend>
<span class="fs-16">UCenter</span>
<a href="{{:MyUrl('admin/pluginsadmin/index')}}" class="fr fs-14 m-t-5 am-icon-mail-reply"> 返回</a>
</legend>
<div class="ucenter-content">
<div class="items">
<label>同步登录</label>
<div>
{{if !empty($data['login_sync_url'])}}
{{$data.login_sync_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户登录账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>异步登录</label>
<div>
{{if !empty($data['login_async_url'])}}
{{$data.login_async_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户登录账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>同步注册</label>
<div>
{{if !empty($data['register_sync_url'])}}
{{$data.register_sync_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数(手机号、邮箱、用户名、用户昵称 都为可选参数[但至少会有一个字段存在])<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户注册账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; mobile 手机号<br />
&nbsp;&nbsp;&nbsp; email 邮箱<br />
&nbsp;&nbsp;&nbsp; username 用户名<br />
&nbsp;&nbsp;&nbsp; nickname 用户昵称<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>异步注册</label>
<div>
{{if !empty($data['register_async_url'])}}
{{$data.register_async_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数(手机号、邮箱、用户名、用户昵称 都为可选参数[但至少会有一个字段存在])<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户注册账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; mobile 手机号<br />
&nbsp;&nbsp;&nbsp; email 邮箱<br />
&nbsp;&nbsp;&nbsp; username 用户名<br />
&nbsp;&nbsp;&nbsp; nickname 用户昵称<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>同步退出</label>
<div>
{{if !empty($data['logout_sync_url'])}}
{{$data.logout_sync_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]
</div>
</div>
<div class="items">
<label>异步退出</label>
<div>
{{if !empty($data['logout_async_url'])}}
{{$data.logout_async_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]
</div>
</div>
<div class="items">
<label>异步登录密码修改</label>
<div>
{{if !empty($data['loginpwdupdate_async_url'])}}
{{$data.loginpwdupdate_async_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>异步账号修改</label>
<div>
{{if !empty($data['accounts_async_url'])}}
{{$data.accounts_async_url|raw}}
{{else /}}
{{/if}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 原来的账号<br />
&nbsp;&nbsp;&nbsp; new_accounts 新的账号<br />
&nbsp;&nbsp;&nbsp; field 字段类型(mobile、email、username)
</div>
</div>
<div class="items">
<label>api接口-登录</label>
<div>
{{:PluginsHomeUrl('ucenter', 'api', 'login')}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户登录账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>api接口-注册</label>
<div>
{{:PluginsHomeUrl('ucenter', 'api', 'register')}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 用户注册账号信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; pwd 密码
</div>
</div>
<div class="items">
<label>api接口-退出</label>
<div>
{{:PluginsHomeUrl('ucenter', 'api', 'logout')}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]
</div>
</div>
<div class="items">
<label>api接口-登录密码修改</label>
<div>
{{:PluginsHomeUrl('ucenter', 'api', 'loginpwdupdate')}}
</div>
<div class="am-alert am-alert-warning" data-am-alert>
附带参数<br />
data 当前用户数据 [ 以 urlencode(json_encode($data)) ]<br />
params 修改密码参数信息 [ 以 urlencode(json_encode($params)) ]<br />
&nbsp;&nbsp;&nbsp; accounts 账号<br />
&nbsp;&nbsp;&nbsp; my_pwd 原始密码<br />
&nbsp;&nbsp;&nbsp; new_pwd 新密码<br />
&nbsp;&nbsp;&nbsp; confirm_new_pwd 确认新密码
</div>
</div>
<a href="{{:PluginsAdminUrl('ucenter', 'admin', 'saveinfo')}}" class="am-btn am-btn-secondary am-radius btn-loading-example am-btn-sm am-btn-block edit-submit">编辑</a>
</div>
</div>
</div>
<!-- right content end -->
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->
\ No newline at end of file
{{include file="public/header" /}}
<!-- right content start -->
<div class="content-right">
<div class="content">
<!-- form start -->
<form class="am-form form-validation view-save" action="{{:PluginsAdminUrl('ucenter', 'admin', 'save')}}" method="POST" request-type="ajax-url" request-value="{{:PluginsAdminUrl('ucenter', 'admin', 'index')}}" enctype="multipart/form-data">
<legend>
<span class="fs-16">UCenter</span>
<a href="{{:PluginsAdminUrl('ucenter', 'admin', 'index')}}" class="fr fs-14 m-t-5 am-icon-mail-reply"> 返回</a>
</legend>
<div class="am-form-group am-form-file">
<label class="block">同步登录<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="login_sync_url" class="am-radius am-field-valid" placeholder="同步登录" data-validation-message="请填写同步登录">{{if !empty($data['login_sync_url'])}}{{$data.login_sync_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">异步登录<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="login_async_url" class="am-radius am-field-valid" placeholder="异步登录" data-validation-message="请填写异步登录">{{if !empty($data['login_async_url'])}}{{$data.login_async_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">同步注册<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="register_sync_url" class="am-radius am-field-valid" placeholder="同步注册" data-validation-message="请填写同步注册">{{if !empty($data['register_sync_url'])}}{{$data.register_sync_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">异步注册<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="register_async_url" class="am-radius am-field-valid" placeholder="异步注册" data-validation-message="请填写异步注册">{{if !empty($data['register_async_url'])}}{{$data.register_async_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">同步退出<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="logout_sync_url" class="am-radius am-field-valid" placeholder="同步退出" data-validation-message="请填写同步退出">{{if !empty($data['logout_sync_url'])}}{{$data.logout_sync_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">异步退出<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="logout_async_url" class="am-radius am-field-valid" placeholder="异步退出" data-validation-message="请填写异步退出">{{if !empty($data['logout_async_url'])}}{{$data.logout_async_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">异步登录密码修改<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="loginpwdupdate_async_url" class="am-radius am-field-valid" placeholder="异步登录密码修改" data-validation-message="请填写异步登录密码修改">{{if !empty($data['loginpwdupdate_async_url'])}}{{$data.loginpwdupdate_async_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-file">
<label class="block">异步账号修改<span class="am-form-group-label-tips">一行一个、GET请求</span></label>
<textarea rows="4" name="accounts_async_url" class="am-radius am-field-valid" placeholder="异步账号修改" data-validation-message="请填写异步账号修改">{{if !empty($data['accounts_async_url'])}}{{$data.accounts_async_url}}{{/if}}</textarea>
</div>
<div class="am-form-group am-form-group-refreshing">
<button type="submit" class="am-btn am-btn-primary am-radius btn-loading-example am-btn-sm w100" data-am-loading="{loadingText:'处理中...'}">保存</button>
</div>
</form>
<!-- form end -->
</div>
</div>
<!-- right content end -->
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->
\ No newline at end of file
<div class="am-alert am-alert-warning am-radius" style="margin: 0;">
<div class="am-container">{{$data.content}}</div>
</div>
\ No newline at end of file
......@@ -11,6 +11,7 @@
namespace app\service;
use think\Db;
use think\facade\Hook;
use app\service\UserService;
/**
......@@ -65,7 +66,7 @@ class SafetyService
}
// 获取用户账户信息
$user = Db::name('User')->field('id,pwd,salt')->find($params['user']['id']);
$user = Db::name('User')->field('id,pwd,salt,username,mobile,email')->find($params['user']['id']);
// 原密码校验
if(LoginPwdEncryption($params['my_pwd'], $user['salt']) != $user['pwd'])
......@@ -79,20 +80,54 @@ class SafetyService
return DataReturn('确认密码与新密码不一致', -5);
}
// 更新用户密码
$salt = GetNumberCode(6);
$data = [
'pwd' => LoginPwdEncryption(trim($params['new_pwd']), $salt),
'salt' => $salt,
'upd_time' => time(),
];
// 更新数据库
if(Db::name('User')->where(['id'=>$params['user']['id']])->update($data) !== false)
// 密码修改
$accounts = empty($user['mobile']) ? (empty($user['email']) ? $user['username'] : $user['email']) : $user['mobile'];
$ret = self::UserLoginPwdUpdate($accounts, $user['id'], $params['new_pwd']);
if($ret['code'] != 0)
{
return DataReturn('操作成功', 0);
}
return DataReturn('操作失败', -100);
return $ret;
}
/**
* 用户密码修改
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-03
* @desc description
* @param [string] $accounts [账号]
* @param [int] $user_id [用户id]
* @param [string] $pwd [密码]
*/
public static function UserLoginPwdUpdate($accounts, $user_id, $pwd)
{
$salt = GetNumberCode(6);
$data = array(
'pwd' => LoginPwdEncryption(trim($pwd), $salt),
'salt' => $salt,
'upd_time' => time(),
);
if(Db::name('User')->where(['id'=>$user_id])->update($data) !== false)
{
// 用户登录密码修改钩子
$hook_name = 'plugins_service_user_login_pwd_update';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => ['accounts'=>$accounts, 'pwd'=>$pwd],
'user_id' => $user_id,
'user' => Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user_id])->find(),
]);
if(isset($ret['code']) && $ret['code'] != 0)
{
return $ret;
}
return DataReturn('修改成功');
}
return DataReturn('修改失败', -100);
}
/**
......@@ -107,7 +142,7 @@ class SafetyService
private static function IsExistAccounts($accounts, $type)
{
$field = ($type == 'sms') ? 'mobile' : 'email';
$user = Db::name('User')->where([$field=>$accounts])->value('id');
$user = Db::name('User')->where([$field=>$accounts])->field('id')->find();
if(!empty($user))
{
$msg = ($type == 'sms') ? '手机号码已存在' : '电子邮箱已存在';
......@@ -355,10 +390,12 @@ class SafetyService
// 帐号是否已存在
$ret = self::IsExistAccounts($params['accounts'], $params['type']);
if($ret['code'] != 0)
{
return $ret;
}
if($ret['code'] != 0)
{
return $ret;
} else {
$user = Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$params['user']['id']])->find();
}
// 验证码校验
$verify_params = array(
......@@ -371,6 +408,7 @@ class SafetyService
} else {
$obj = new \base\Email($verify_params);
}
// 是否已过期
if(!$obj->CheckExpire())
{
......@@ -389,7 +427,7 @@ class SafetyService
'upd_time' => time(),
);
// 更新数据库
if(Db::name('User')->where(array('id'=>$params['user']['id']))->update($data) !== false)
if(Db::name('User')->where(['id'=>$params['user']['id']])->update($data) !== false)
{
// 更新用户session数据
UserService::UserLoginRecord($params['user']['id']);
......@@ -400,6 +438,20 @@ class SafetyService
// 清除验证码
$obj->Remove();
// 账号修改钩子
$hook_name = 'plugins_service_user_accounts_update';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => ['accounts'=>$user[$field], 'new_accounts'=>$params['accounts'], 'field'=>$field],
'user_id' => $user['id'],
'user' => Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user['id']])->find(),
]);
if(isset($ret['code']) && $ret['code'] != 0)
{
return $ret;
}
return DataReturn('操作成功', 0);
}
return DataReturn('操作失败', -100);
......
......@@ -13,6 +13,7 @@ namespace app\service;
use think\Db;
use think\facade\Hook;
use app\service\RegionService;
use app\service\SafetyService;
/**
* 用户服务层
......@@ -850,9 +851,9 @@ class UserService
}
// 登录帐号格式校验
if(!CheckMobile($params['accounts']) && !CheckEmail($params['accounts']))
if(empty($params['accounts']))
{
return DataReturn('手机/邮箱格式有误', -1);
return DataReturn('登录账号有误', -1);
}
// 密码
......@@ -863,7 +864,7 @@ class UserService
}
// 获取用户账户信息
$where = array('mobile|email' => $params['accounts'], 'is_delete_time'=>0);
$where = array('username|mobile|email' => $params['accounts'], 'is_delete_time'=>0);
$user = Db::name('User')->field('id,pwd,salt,status')->where($where)->find();
if(empty($user))
{
......@@ -902,25 +903,34 @@ class UserService
'salt' => $salt,
'upd_time' => time(),
);
if(Db::name('User')->where(array('id'=>$user['id']))->update($data) !== false)
if(Db::name('User')->where(['id'=>$user['id']])->update($data) !== false)
{
// 登录记录
if(self::UserLoginRecord($user['id']))
{
// 返回前端html代码
$body_html = [];
// 用户登录后钩子
$hook_name = 'plugins_service_user_login_end';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => &$params,
'user_id' => $user['id']
'user_id' => $user['id'],
'user' => Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user['id']])->find(),
'body_html' => &$body_html,
]);
if(isset($ret['code']) && $ret['code'] != 0)
{
return $ret;
}
return DataReturn('登录成功', 0);
// 登录返回
$result = [
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
];
return DataReturn('登录成功', 0, $result);
}
}
return DataReturn('登录失效,请重新登录', -100);
......@@ -1021,8 +1031,8 @@ class UserService
}
// 数据添加
$user_id = Db::name('User')->insertGetId($data);
if($user_id > 0)
$user_ret = self::UserInsert($data, $params);
if($user_ret['code'] == 0)
{
// 清除验证码
$obj->Remove();
......@@ -1034,11 +1044,13 @@ class UserService
}
// 用户登录session纪录
if(self::UserLoginRecord($user_id))
if(self::UserLoginRecord($user_ret['data']['user_id']))
{
return DataReturn('注册成功', 0);
return DataReturn('注册成功', 0, $user_ret);
}
return DataReturn('注册成功,请到登录页面登录帐号');
} else {
return $user_ret;
}
return DataReturn('注册失败', -100);
}
......@@ -1399,18 +1411,20 @@ class UserService
return DataReturn('验证码错误', -11);
}
// 更新用户密码
$salt = GetNumberCode(6);
$data = array(
'pwd' => LoginPwdEncryption($params['pwd'], $salt),
'salt' => $salt,
'upd_time' => time(),
);
if(Db::name('User')->where(array($ret['data']=>$params['accounts']))->update($data) !== false)
// 获取用户信息
$user = Db::name('User')->where([$ret['data']=>$params['accounts']])->find();
if(empty($user))
{
return DataReturn('操作成功');
return DataReturn('用户信息不存在', -12);
}
return DataReturn('操作失败', -100);
// 密码修改
$ret = SafetyService::UserLoginPwdUpdate($params['accounts'], $user['id'], $params['pwd']);
if($ret['code'] != 0)
{
return DataReturn('操作成功', 0);
}
return $ret;
}
/**
......@@ -1523,6 +1537,66 @@ class UserService
return Db::name('User')->where([$field=>$value, 'is_delete_time'=>0])->find();
}
/**
* 用户添加
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-04-03
* @desc description
* @param [array] $data [用户添加数据]
* @param [array] $params [输入参数]
*/
public static function UserInsert($data, $params = [])
{
// 账号是否存在,以用户名 手机 邮箱 作为唯一
if(!empty($data['username']))
{
$temp = Db::name('User')->where(['username'=>$data['username'], 'is_delete_time'=>0])->find();
} else if(!empty($data['mobile']))
{
$temp = Db::name('User')->where(['mobile'=>$data['mobile'], 'is_delete_time'=>0])->find();
} else if(!empty($data['email']))
{
$temp = Db::name('User')->where(['email'=>$data['email'], 'is_delete_time'=>0])->find();
}
if(!empty($temp))
{
return DataReturn('账号已存在', -10);
}
$user_id = Db::name('User')->insertGetId($data);
if($user_id > 0)
{
// 返回前端html代码
$body_html = [];
// 注册成功后钩子
$hook_name = 'plugins_service_user_register_end';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => &$params,
'user_id' => $user_id,
'user' => Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user_id])->find(),
'body_html' => &$body_html,
]);
if(isset($ret['code']) && $ret['code'] != 0)
{
return $ret;
}
// 登录返回
$result = [
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
'user_id' => $user_id,
];
return DataReturn('添加成功', 0, $result);
}
return DataReturn('添加失败', -100);
}
/**
* app用户注册
* @author Devil
......@@ -1630,7 +1704,13 @@ class UserService
{
$data['referrer'] = isset($params['referrer']) ? intval($params['referrer']) : 0;
$data['add_time'] = time();
$user_id = Db::name('User')->insertGetId($data);
$user_ret = self::UserInsert($data, $params);
if($user_ret['code'] == 0)
{
$user_id = $user_ret['data']['user_id'];
} else {
return $user_ret;
}
} else {
$data['upd_time'] = time();
if(Db::name('User')->where($where)->update($data))
......@@ -1702,5 +1782,43 @@ class UserService
}
}
/**
* 用户退出
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-05T14:31:23+0800
* @param [array] $params [输入参数]
*/
public static function Logout($params = [])
{
// 用户信息
$user = self::LoginUserInfo();
// 清除session
session('user', null);
// html代码
$body_html = [];
// 用户退出钩子
$hook_name = 'plugins_service_user_logout_handle';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => [],
'user_id' => isset($user['id']) ? $user['id'] : 0,
'user' => $user,
'body_html' => &$body_html,
]);
// 数据返回
$result = [
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
];
return DataReturn('退出成功', 0, $result);
}
}
?>
\ No newline at end of file
......@@ -45,6 +45,7 @@ return array (
'plugins_service_user_login_end' =>
array (
0 => 'app\\plugins\\userloginrewardintegral\\Hook',
1 => 'app\\plugins\\ucenter\\Hook',
),
'plugins_css' =>
array (
......@@ -117,5 +118,21 @@ return array (
0 => 'app\\plugins\\freightfee\\Hook',
1 => 'app\\plugins\\newuserreduction\\Hook',
),
'plugins_service_user_register_end' =>
array (
0 => 'app\\plugins\\ucenter\\Hook',
),
'plugins_service_user_logout_handle' =>
array (
0 => 'app\\plugins\\ucenter\\Hook',
),
'plugins_service_user_login_pwd_update' =>
array (
0 => 'app\\plugins\\ucenter\\Hook',
),
'plugins_service_user_accounts_update' =>
array (
0 => 'app\\plugins\\ucenter\\Hook',
),
);
?>
\ No newline at end of file
......@@ -19,7 +19,7 @@ return [
// 应用地址
'app_host' => '',
// 应用调试模式
'app_debug' => false,
'app_debug' => true,
// 应用Trace
'app_trace' => false,
// 是否支持多模块
......
此差异已折叠。
......@@ -413,7 +413,7 @@ background:url(../images/ibar_sprites.png) no-repeat;background-position:0px -23
/* 公共错误提示页面 */
.tips-error, .tips-success { margin: 10% 0; }
.tips-pay-success, .tips-pay-error { box-shadow: none; text-align: center; }
.tips-pay-success, .tips-pay-error, .tips-error, .tips-success { box-shadow: none; text-align: center; }
.tips-error i.am-icon-times-circle, .tips-success i.am-icon-check-circle { font-size: 26px; }
.tips-error i.am-icon-times-circle { color: #F44336; }
.tips-success i.am-icon-check-circle { color: #4CAF50; }
......
/**
* 首页
*/
.ucenter-content .items {
margin: 10px 0 20px 0;
border-bottom: 1px dashed #f1f1f1;
padding-bottom: 20px;
}
.ucenter-content .edit-submit {
margin-bottom: 20px;
}
/**
* 编辑页面
*/
ul.plugins-images-view li {
width: 100%;
height: auto;
}
.form-date input {
width: 30% !important;
display: -webkit-inline-box !important;
}
.form-date span {
vertical-align: middle;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册