fix:更新已知bug,优化代码

This commit is contained in:
Ying
2022-11-28 19:11:12 +08:00
parent f6aee95cfc
commit 9445b206a2
1378 changed files with 53759 additions and 20789 deletions

View File

@@ -16,10 +16,13 @@ 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控制器
@@ -36,10 +39,10 @@ class Ajax extends HomeController
}
/**
* 发送短信
* @return mixed|void
* 发送短信验证码
* @throws DataNotFoundException
* @throws DbException
* @throws InvalidArgumentException
* @throws ModelNotFoundException
*/
public function smsSend()
@@ -59,10 +62,10 @@ class Ajax extends HomeController
return $this->error(__('发送频繁'));
}
$userinfo = User::getByMobile($mobile);
if (in_array($event, ['register', 'changer']) && $userinfo) {
$userData = User::getByMobile($mobile);
if (in_array($event, ['register', 'changer']) && $userData) {
return $this->error('当前手机号已被占用');
} else if ($event == 'forgot' && !$userinfo) {
} else if ($event == 'forgot' && !$userData) {
return $this->error('当前手机号未注册');
}
@@ -75,11 +78,12 @@ class Ajax extends HomeController
}
/**
* 发送邮件
* @return mixed|void
* 发送邮件验证码
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
* @throws InvalidArgumentException
*/
public function emailSend()
{
@@ -99,10 +103,10 @@ class Ajax extends HomeController
return $this->error(__('发送频繁'));
}
$userinfo = User::getByEmail($email);
if (in_array($event, ['register', 'changer']) && $userinfo) {
$userData = User::getByEmail($email);
if (in_array($event, ['register', 'changer']) && $userData) {
return $this->error('当前邮箱已被注册');
} else if ($event == 'forgot' && !$userinfo) {
} else if ($event == 'forgot' && !$userData) {
return $this->error('当前邮箱不存在');
}

View File

@@ -12,8 +12,11 @@ declare (strict_types=1);
namespace app\index\controller;
use app\HomeController;
use Psr\SimpleCache\InvalidArgumentException;
use support\Response;
use Psr\SimpleCache\InvalidArgumentException;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
class Index extends HomeController
{
@@ -21,8 +24,11 @@ class Index extends HomeController
* 前端首页
* @return Response
* @throws InvalidArgumentException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function index(): \support\Response
public function index(): Response
{
return $this->view('index/index', ['name' => 'meystack']);
}

View File

@@ -19,6 +19,9 @@ use app\common\model\system\User;
use app\common\model\system\UserThird;
use support\Response;
use system\Random;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
/**
* 社会化登录
@@ -28,20 +31,20 @@ class Third extends HomeController
{
/**
* 类型
* @var string
* @var mixed
*/
public $type = null;
public mixed $type;
/**
* 类型实例
* @var Object
* @var mixed
*/
public $oauth = null;
public mixed $oauth;
/**
* @var array
*/
public $repeatLogin = [];
public array $repeatLogin = [];
/**
* 初始化构造函数
@@ -70,7 +73,7 @@ class Third extends HomeController
/**
* 用户登录操作
*/
public function login(): \support\Response
public function login(): Response
{
try {
$this->oauth = $this->oType();
@@ -85,9 +88,9 @@ class Third extends HomeController
/**
* 用户回调函数
* @return mixed|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function callback()
{
@@ -96,40 +99,40 @@ class Third extends HomeController
} catch (\Exception $e) {
return $this->error($e->getMessage());
}
$userInfos = $this->oauth->getUserInfo();
if (!empty($userInfos) && !$this->auth->isLogin()) {
return $this->register($userInfos, $this->type);
$userData = $this->oauth->getUserInfo();
if (!empty($userData) && !$this->auth->isLogin()) {
return $this->register($userData, $this->type);
} else if ($this->auth->isLogin()) { // 绑定用户
return $this->doBind($userInfos, $this->type);
return $this->doBind($userData, $this->type);
}
}
/**
* 用户注册操作
* @param array $userInfos
* @param array $userDatas
* @param string|null $type
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
protected function register(array $userInfos = [], string $type = null)
protected function register(array $userDatas = [], string $type = null)
{
$openid = $userInfos['openid'] ?? $userInfos['id'];
$nickname = $userInfos['userinfo']['name'] ?? $userInfos['userinfo']['nickname'];
$userInfo = UserThird::alias('th')
$openid = $userDatas['openid'] ?? $userDatas['id'];
$nickname = $userDatas['userData']['name'] ?? $userDatas['userData']['nickname'];
$userData = UserThird::alias('th')
->view('user', '*', 'user.id=th.user_id')
->where(['openid' => $openid, 'type' => $type])
->find();
if (!empty($userInfo)) {
$array['id'] = $userInfo['id'];
if (!empty($userData)) {
$array['id'] = $userData['id'];
$array['login_time'] = time();
$array['login_ip'] = request()->getRealIp();
$array['login_count'] = $userInfo['login_count'] + 1;
$array['login_count'] = $userData['login_count'] + 1;
if (User::update($array)) {
$response = $this->auth->responseToken($userInfo);
$response = $this->auth->responseToken($userData);
$response->withBody(json_encode(ResultCode::LOGINSUCCESS))->redirect(request()->cookie('redirectUrl', '/'));
}
@@ -137,7 +140,7 @@ class Third extends HomeController
// 注册本地用户
$data['nickname'] = $nickname;
$data['avatar'] = $userInfos['userinfo']['avatar'];
$data['avatar'] = $userDatas['userData']['avatar'];
if (User::getByNickname($nickname)) {
$data['nickname'] .= Random::alpha(3);
}
@@ -152,11 +155,11 @@ class Third extends HomeController
'user_id' => $result['id'],
'openid' => $openid,
'nickname' => $nickname,
'access_token' => $userInfos['access_token'],
'refresh_token' => $userInfos['refresh_token'],
'expires_in' => $userInfos['expires_in'],
'access_token' => $userDatas['access_token'],
'refresh_token' => $userDatas['refresh_token'],
'expires_in' => $userDatas['expires_in'],
'login_time' => time(),
'expiretime' => time() + $userInfos['expires_in'],
'expiretime' => time() + $userDatas['expires_in'],
];
}
@@ -176,7 +179,7 @@ class Third extends HomeController
* 用户绑定操作
* @return Response
*/
public function bind(): \support\Response
public function bind(): Response
{
if (Auth::instance()->isLogin()) {
$buildQuery = [
@@ -193,10 +196,9 @@ class Third extends HomeController
/**
* 用户解除绑定
* @return mixed|void
* @throws \think\db\exception\DbException
* @throws DbException
*/
public function unbind(): \support\Response
public function unbind(): Response
{
try {
$this->oauth = $this->oType();
@@ -205,7 +207,7 @@ class Third extends HomeController
}
if ($this->auth->isLogin()) {
$result = $this->auth->userInfo;
$result = $this->auth->userData;
if (!empty($result)) {
if (empty($result['email']) || empty($result['pwd'])) {
@@ -225,18 +227,18 @@ class Third extends HomeController
/**
* 用户绑定操作实例
* @param array $userInfos
* @param array $userDatas
* @param string|null $type
* @return \support\Response|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return Response|null
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
protected function doBind(array $userInfos = [], string $type = null)
protected function doBind(array $userDatas = [], string $type = null)
{
$openid = $userInfos['openid'] ?? $userInfos['id'];
$nickname = $userInfos['userinfo']['name'] ?? $userInfos['userinfo']['nickname'];
$openid = $userDatas['openid'] ?? $userDatas['id'];
$nickname = $userDatas['userData']['name'] ?? $userDatas['userData']['nickname'];
// 查询是否被注册
$where['openid'] = $openid;
@@ -249,11 +251,11 @@ class Third extends HomeController
'user_id' => request()->cookie('uid'),
'openid' => $openid,
'nickname' => $nickname,
'access_token' => $userInfos['access_token'],
'refresh_token' => $userInfos['refresh_token'],
'expires_in' => $userInfos['expires_in'],
'access_token' => $userDatas['access_token'],
'refresh_token' => $userDatas['refresh_token'],
'expires_in' => $userDatas['expires_in'],
'login_time' => time(),
'expiretime' => time() + $userInfos['expires_in'],
'expiretime' => time() + $userDatas['expires_in'],
];
if (UserThird::create($third)) {
@@ -268,9 +270,9 @@ class Third extends HomeController
/**
* 跳转URL
* @return void
* @return Response
*/
protected function redirectUrl(): \support\Response
protected function redirectUrl(): Response
{
$referer = request()->cookie('redirectUrl', '/');

View File

@@ -13,29 +13,40 @@ declare(strict_types=1);
namespace app\index\controller;
use app\common\library\ResultCode;
use app\common\model\system\UserLog;
use app\common\model\system\UserNotice;
use app\HomeController;
use app\common\library\Sms;
use app\common\library\Email;
use app\common\library\Upload;
use app\common\model\system\User as UserModel;
use PHPMailer\PHPMailer\Exception;
use Psr\SimpleCache\InvalidArgumentException;
use support\Request;
use support\Response;
use system\Http;
use system\Random;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use Webman\Event\Event;
class User extends HomeController
{
/**
* 鉴权控制器
*/
public $needLogin = true;
public bool $needLogin = true;
/**
* 超时时间
*/
public int $expire = 604800;
/**
* 非登录鉴权方法
*/
public $noNeedAuth = ['login', 'register', 'forgot', 'check'];
public array $noNeedAuth = ['login', 'register', 'forgot', 'check'];
public function __construct()
{
@@ -43,35 +54,29 @@ class User extends HomeController
$this->model = new UserModel();
}
/**
* 退出登录
* @return Response
* @throws \Exception
*/
public function logout(): \support\Response
{
$this->auth->logout();
return $this->success('退出成功', url('index/index'));
}
/**
* 用户中心
* @return mixed
* @throws DbException
*/
public function index(): \support\Response
public function index(): Response
{
return view('/user/index');
// 未读短消息
$unread = UserNotice::where('user_id', \request()->user_id)->where('status', 0)->count();
return view('/user/index', [
'unread' => $unread,
]);
}
/**
* 用户注册
* @return \support\Response
* @throws \Psr\SimpleCache\InvalidArgumentException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws InvalidArgumentException
*/
public function register(): \support\Response
public function register(): Response
{
if (request()->isPost()) {
@@ -107,9 +112,9 @@ class User extends HomeController
/**
* 用户登录
* @return \support\Response
* @return Response
*/
public function login(): \support\Response
public function login(): Response
{
if (request()->isPost()) {
@@ -132,12 +137,14 @@ class User extends HomeController
/**
* 找回密码
* @return \support\Response
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws InvalidArgumentException
* @throws ModelNotFoundException
* @throws Exception
*/
public function forgot(): \support\Response
public function forgot(): Response
{
if (request()->isPost()) {
@@ -158,15 +165,15 @@ class User extends HomeController
}
$where = $email ? ['email' => $email] : ['mobile' => $mobile];
$userInfo = $this->model->where($where)->find();
if (!$userInfo) {
$userData = $this->model->where($where)->find();
if (!$userData) {
return $this->error('用户不存在');
}
try {
$salt = Random::alpha();
$pwd = encryptPwd($pwd, $salt);
$this->model->update(['id' => $userInfo['id'], 'pwd' => $pwd, 'salt' => $salt]);
$this->model->update(['id' => $userData['id'], 'pwd' => $pwd, 'salt' => $salt]);
} catch (\Exception $e) {
return $this->error('修改密码失败,请联系管理员');
@@ -186,7 +193,7 @@ class User extends HomeController
* @throws DbException
* @throws ModelNotFoundException
*/
public function profile(Request $request): \support\Response
public function center(Request $request): Response
{
if (request()->isPost()) {
@@ -200,13 +207,245 @@ class User extends HomeController
return $this->error('当前昵称已被占用,请更换!');
}
if ($this->model->update(['id' => $request->userId, 'nickname' => $nickname])) {
if ($this->model->update(['id' => $request->user_id, 'nickname' => $nickname])) {
return $this->success('修改昵称成功!', (string)url('/user/index'));
}
return $this->error();
}
return view('/user/profile');
/**
* 初始化请求新闻
*/
$files = public_path('upload/upgrade') . DIRECTORY_SEPARATOR . 'news.html';
if (!is_file($files)) {
$result = Http::get(config('app.api_url') . '/news/index');
write_file($files, $result);
} else {
$result = read_file($files);
if (filemtime($files) + $this->expire <= time()) {
@unlink($files);
}
}
return view('/user/center', [
'newsHtml' => $result ?? '服务器错误',
'userList' => $this->model->order('login_count', 'desc')->limit(12)->select()->toArray(),
'invite_count' => $this->model->where('invite_id', $request->user_id)->count(),
]);
}
/**
* 消息列表
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function message(): Response
{
if (request()->isAjax()) {
$page = input('page', 1);
$limit = input('limit', 1);
$status = input('status', 'all');
if ($status !== 'all') {
$where[] = ['status', '=', $status];
}
$where[] = ['user_id', '=', \request()->user_id];
$count = UserNotice::where($where)->count();
$page = ($count <= $limit) ? 1 : $page;
$list = UserNotice::where($where)->order('id', 'desc')->limit((int)$limit)->page((int)$page)->select()->toArray();
return $this->success('查询成功', "", $list, $count);
}
return view('/user/message');
}
/**
* 查看消息
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function viewMessage(): Response
{
$id = input('id');
$info = UserNotice::where('id', $id)->find();
if (!$info) {
return $this->error('消息不存在');
}
if ($info['user_id'] != \request()->user_id) {
return $this->error('非法操作');
}
if ($info['status'] == 0) {
UserNotice::update(['id' => $id, 'status' => 1]);
}
if ($info['send_id'] > 0) {
$fromInfo = $this->model->where('id', $info['send_id'])->find();
$info['nickname'] = $fromInfo['nickname'];
}
// 更新未读
$unread = UserNotice::where(['user_id' => \request()->user_id, 'status' => 0])->count();
return view('/user/viewMessage', [
'info' => $info,
'unread' => $unread,
]);
}
/**
* 全部删除消息
* @return Response
* @throws DbException
*/
public function derMessage(): Response
{
if (\request()->isPost()) {
$ids = input('id');
$type = input('type', 'del');
$where[] = ['id', 'in', implode(',', $ids)];
$where[] = ['user_id', '=', \request()->user_id];
if ($type === 'del') {
if (UserNotice::where($where)->delete()) {
return $this->success('删除成功');
}
} else {
if (UserNotice::where($where)->update(['status' =>1])) {
return $this->success('操作成功');
}
}
return $this->error('操作失败');
}
return $this->error('非法操作');
}
/**
* 用户资料
* @param Request $request
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function profile(Request $request): Response
{
if (request()->isPost()) {
$nickname = input('nickname');
$post = request_validate_rules(request()->Post(), get_class($this->model), 'nickname');
if (!is_array($post)) {
return $this->error($post);
}
if ($nickname != \request()->userData['nickname']
&&$this->model->where('nickname', $nickname)->find()) {
return $this->error('当前昵称已被占用,请更换!');
}
unset($post['money']);
unset($post['score']);
$user = $this->model->find(\request()->user_id);
if ($user->save($post)) {
return $this->success('更新资料成功');
}
return $this->error();
}
return view('/user/profile',[
'user' => \request()->userData,
]);
}
/**
* 实名认证
* @return Response
*/
public function certification(): Response
{
if (request()->isPost()) {
$name = input('name');
$mobile = input('mobile');
$idCard = input('idCard');
$captcha = input('captcha');
if (!empty(\request()->userData['prove'])) {
return $this->error('您已经实名认证过了!');
}
// 判断是否安装实名认证插件
if (!Event::hasListener('certification')) {
return $this->error('实名认证插件未安装');
}
// 判断验证码
if (!$captcha || !$this->captchaCheck($captcha)) {
return $this->error('验证码错误');
}
try {
$result = Event::emit('certification', [
'name' => $name,
'mobile' => $mobile,
'idCard' => $idCard,
]);
if ($result['code'] != 1) {
throw new \Exception($result['msg']);
}
// 更新系统认证信息
$this->model->where('id', \request()->user_id)->update([
'prove' => 1,
'name' => $name,
'idCard' => $idCard,
'mobile' => $mobile,
'prove_time' => date('Y-m-d H:i:s', time())
]);
} catch (\Exception $e) {
return $this->error('实名认证失败,请联系管理员');
}
return $this->success('实名认证成功!');
}
return view('/user/certification',['prove' => \request()->userData['prove']]);
}
/**
* 用户登录日志
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function login_log(): Response
{
if (request()->isAjax()) {
// 获取数据
$page = input('page', 1);
$limit = input('limit', 1);
$where[] = ['login_id', '=', \request()->user_id];
$count = UserLog::where($where)->count();
$page = ($count <= $limit) ? 1 : $page;
$list = UserLog::where($where)->order('id', 'desc')->limit((int)$limit)->page((int)$page)->select()->toArray();
return $this->success('查询成功', "", $list, $count);
}
return view('/user/login_log');
}
/**
@@ -214,22 +453,22 @@ class User extends HomeController
* @param Request $request
* @return Response
*/
public function changePwd(Request $request): \support\Response
public function changePwd(Request $request): Response
{
if (request()->isPost()) {
// 获取参数
$pwd = input('pwd');
$oldPwd = input('oldpwd');
$yPwd = encryptPwd($oldPwd, $request->userInfo->salt);
$yPwd = encryptPwd($oldPwd, $request->userData->salt);
if ($yPwd != $request->userInfo->pwd) {
if ($yPwd != $request->userData->pwd) {
return $this->error('原密码输入错误!');
}
$salt = Random::alpha();
$pwd = encryptPwd($pwd, $salt);
$result = $this->model->update(['id' => $request->userId, 'pwd' => $pwd, 'salt' => $salt]);
$result = $this->model->update(['id' => $request->user_id, 'pwd' => $pwd, 'salt' => $salt]);
if (!empty($result)) {
return $this->success('修改密码成功!');
}
@@ -248,8 +487,8 @@ class User extends HomeController
{
if (request()->isPost()) {
$data = array();
$data['id'] = $request->userId;
$data['app_id'] = 10000 + $request->userId;
$data['id'] = $request->user_id;
$data['app_id'] = 10000 + $request->user_id;
$data['app_secret'] = Random::alpha(22);
if ($this->model->update($data)) {
return $this->success();
@@ -260,13 +499,15 @@ class User extends HomeController
/**
* 修改邮箱
* @return \support\Response
* @throws \PHPMailer\PHPMailer\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @param Request $request
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws Exception
* @throws InvalidArgumentException
* @throws ModelNotFoundException
*/
public function email(Request $request): \support\Response
public function email(Request $request): Response
{
if (request()->isPost()) {
@@ -286,7 +527,7 @@ class User extends HomeController
if (!empty($email) && !empty($captcha)) {
if ($Ems->check($email, $captcha, $event)) {
$this->model->update(['id' => $request->userId, 'email' => $email]);
$this->model->update(['id' => $request->user_id, 'email' => $email]);
return $this->success('修改邮箱成功!');
}
@@ -308,14 +549,13 @@ class User extends HomeController
return view('/user/email');
}
/**
* 修改手机号
* @param Request $request
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws ModelNotFoundException|InvalidArgumentException
*/
public function mobile(Request $request): Response
{
@@ -338,7 +578,7 @@ class User extends HomeController
if (!empty($mobile) && !empty($captcha)) {
if ($Sms->check($mobile, $captcha, $event)) {
$this->model->update(['id' => $request->userId, 'mobile' => (int)$mobile]);
$this->model->update(['id' => $request->user_id, 'mobile' => (int)$mobile]);
return $this->success('修改手机号成功!');
}
@@ -366,7 +606,7 @@ class User extends HomeController
* @param Request $request
* @return Response
*/
public function protection(Request $request): \support\Response
public function protection(Request $request): Response
{
$validate = [
'你家的宠物叫啥?',
@@ -387,9 +627,9 @@ class User extends HomeController
}
try {
$request->userInfo->question = $question;
$request->userInfo->answer = $answer;
$request->userInfo->save();
$request->userData->question = $question;
$request->userData->answer = $answer;
$request->userData->save();
} catch (\Throwable $th) {
return $this->error();
}
@@ -412,19 +652,19 @@ class User extends HomeController
$maxProgress = 5;
$thisProgress = 1;
if ($request->userInfo->email) {
if ($request->userData->email) {
$thisProgress++;
}
if ($request->userInfo->mobile) {
if ($request->userData->mobile) {
$thisProgress++;
}
if ($request->userInfo->answer) {
if ($request->userData->answer) {
$thisProgress++;
}
if ($request->userInfo->wechat) {
if ($request->userData->wechat) {
$thisProgress++;
}
@@ -438,18 +678,21 @@ class User extends HomeController
/**
* 用户头像上传
* @param Request $request
* @return Response|void
* @throws \Exception
* @return Response
* @throws DataNotFoundException
* @throws DbException
* @throws InvalidArgumentException
* @throws ModelNotFoundException
*/
public function avatar(Request $request)
public function avatar(Request $request): Response
{
if (request()->isPost()) {
$response = Upload::instance()->upload();
if (!$response) {
return $this->error(Upload::instance()->getError());
}
$request->userInfo->avatar = $response['url'] . '?' . Random::alpha(12);
if ($request->userInfo->save()) {
$request->userData->avatar = $response['url'] . '?' . Random::alpha(12);
if ($request->userData->save()) {
return json($response);
}
}
@@ -459,10 +702,8 @@ class User extends HomeController
/**
* 文件上传函数
* @return mixed
* @throws \Exception
*/
public function upload()
public function upload(): Response
{
if (request()->isPost()) {
$file = Upload::instance()->upload();
@@ -474,4 +715,33 @@ class User extends HomeController
return json(ResultCode::SUCCESS);
}
/**
* 远程下载图片
* @throws DataNotFoundException
* @throws DbException
* @throws InvalidArgumentException
* @throws ModelNotFoundException
*/
public function getImage()
{
if (request()->isPost()) {
$file = Upload::instance()->download(input('url'));
if (!$file) {
return $this->error(Upload::instance()->getError());
}
return json($file);
}
}
/**
* 退出登录
* @return Response
* @throws \Exception
*/
public function logout(): Response
{
$this->auth->logout();
return $this->success('退出成功', url('/'));
}
}

View File

@@ -24,14 +24,15 @@ use Webman\Http\Request;
*/
class StaticFile implements MiddlewareInterface
{
public function process(Request $request, callable $next): Response
public function process(Request $request, callable $handler): Response
{
// Access to files beginning with. Is prohibited
if (strpos($request->path(), '/.') !== false) {
if (str_contains($request->path(), '/.')) {
return response('<h1>403 forbidden</h1>', 403);
}
/** @var Response $response */
$response = $next($request);
$response = $handler($request);
// Add cross domain HTTP header
/*$response->withHeaders([
'Access-Control-Allow-Origin' => '*',

View File

@@ -11,6 +11,11 @@ declare (strict_types=1);
// +----------------------------------------------------------------------
namespace app\index\middleware\system;
use Psr\SimpleCache\InvalidArgumentException;
use support\View;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
@@ -30,10 +35,10 @@ class IndexInitialize implements MiddlewareInterface
* @param Request $request
* @param callable $handler
* @return Response
* @throws \Psr\SimpleCache\InvalidArgumentException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @throws InvalidArgumentException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function process(Request $request, callable $handler): Response
{
@@ -54,7 +59,7 @@ class IndexInitialize implements MiddlewareInterface
$siteInfo = saenv('site', true);
if ($siteInfo && is_array($siteInfo)) {
foreach ($siteInfo as $key => $value) {
\support\View::assign($key,$value);
View::assign($key,$value);
}
}

View File

@@ -3,6 +3,7 @@
namespace app\index\middleware\system;
use app\common\library\Auth;
use app\common\library\ResultCode;
use support\View;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
@@ -19,25 +20,25 @@ class IndexPermissions implements MiddlewareInterface
* 控制器登录鉴权
* @var bool
*/
public $needLogin = false;
public bool $needLogin = false;
/**
* 禁止登录重复
* @var array
*/
public $repeatLogin = ['login', 'register'];
public array $repeatLogin = ['login', 'register'];
/**
* 非鉴权方法
* @var array
*/
public $noNeedAuth = [];
public array $noNeedAuth = [];
/**
* 跳转URL地址
* @var string
*/
public $JumpUrl = '/user/index';
public string $JumpUrl = '/user/index';
/**
* 校验权限
@@ -67,16 +68,21 @@ class IndexPermissions implements MiddlewareInterface
// 是否验证登录器
$auth = Auth::instance();
if ($auth->isLogin()) {
$request->userId = $auth->userInfo['id'];
$request->userInfo = $auth->userInfo;
$request->user_id = $auth->userData['id'];
$request->userData = $auth->userData;
// 禁止重复登录
if (in_array($action, $this->repeatLogin)) {
return redirect($this->JumpUrl);
}
View::assign('user', $auth->userInfo);
View::assign('user', $auth->userData);
} else {
if ($this->needLogin && !in_array($action, $this->noNeedAuth)) {
return redirect('/');
if (\request()->isAjax()) {
return json(ResultCode::PLEASELOGININ);
} else {
return redirect('/user/login');
}
}
}

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 官方演示站</title>
@@ -45,7 +45,6 @@
</div>
</div>
</div>
<div class="layui-col-md6">
<img src="/static/images/hero-img.png" width="90%" height="500" alt="">
</div>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>控制台 | 用户中心</title>

View File

@@ -13,9 +13,9 @@
</ul>
<div class="layui-nav layui-hide-xs fr" id="login">
<notempty name="$user.id"> <li class="layui-nav-item"><a class="" href="/user/index" >会员中心</a></li> <else/>
<li class="layui-nav-item"><a href="javascript:;" lay-open data-title="用户注册" data-area="490px" data-url="/user/register" >注册</a></li>
<li class="layui-nav-item"><a href="javascript:;" lay-open data-title="用户登录" data-area="450px,420px" data-url="/user/login" >登录</a></li>
<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>
</notempty>
</div>
</div>

View File

@@ -0,0 +1,315 @@
<layout name="layout:layout"/>
<style>
#content .layui-table td, #content .layui-table th {
padding: 8px 10px;
}
</style>
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-row layui-col-space20">
<div class="layui-col-md9">
<div class="layui-card">
<div class="layui-card-body swift-index vip-head-box" >
<div class="user-face-box">
<div class="img"><img src="{$user.avatar}" alt="{$user.nickname}" ></div>
</div>
<div class="user-vip-info">
<div class="vip-type-time">
<div class="vip-tips">
<if check_user_third('qq',$user['id']) >
<a lay-ajax class="bind-third" data-url="{:url('/third/unbind',['type'=> 'qq'])}" title="点击解绑"
><i class="layui-icon layui-icon-login-qq"></i></a>
<else/>
<a href="{:url('/third/bind?type=qq&ref=/index/user/index')}" title="点击绑定"target="_top"
><i class="layui-icon layui-icon-login-qq"></i></a>
</if>
<if check_user_third('weixin',$user['id']) >
<a lay-ajax class="bind-third" data-url="{:url('/third/unbind?type=weixin')}" title="点击解绑"
><i class="layui-icon layui-icon-login-wechat"></i></a>
<else/>
<a href="{:url('/third/bind')}?type=weixin&ref=/index/user/index" title="点击绑定"
target="_top"
><i class="layui-icon layui-icon-login-wechat"></i></a>
</if>
<if check_user_third('weibo',$user['id']) >
<a lay-ajax class="bind-third" data-url="{:url('/third/unbind?type=weibo')}" title="点击解绑">
<i class="layui-icon layui-icon-login-weibo"></i></a>
<else/>
<a href="{:url('/third/bind')}?type=wiebo&ref=/index/user/index" title="点击绑定"
target="_top"
><i class="layui-icon layui-icon-login-weibo"></i></a>
</if>
</div>
<div class="vip-name">
<span>{$user.nickname} <i class="layui-icon fa-edit" lay-open data-title="修改昵称" data-url="#nickname" data-area="398px,230px"></i></span>
<span>UID: {$user.id|supplement_id}</span>
<span><a>已加入第 {$user.create_time|distance_day} 天</a></span>
</div>
<div class="vip-time-row">
<salibs:usergroup id="vo">
<div class="vip-item <if ($vo['id'] == $user['group_id']) >vip-active</if>">
<span class="vip-item-type">{$vo.alias}</span>
<span class="vip-item-name">{$vo.title}</span>
</div>
</salibs:usergroup>
</div>
<div class="vip-coupon-row">
<div class="vip-coupon-item"><p><em>{$user.score}</em>我的积分</p></div>
<div class="vip-coupon-item"><p><em style="color: red">¥{$user.money|default='0.0'}</em>我的余额</p></div>
<div class="vip-coupon-item"><p><em>{$invite_count|default='0'}</em>邀请人数</p></div>
</div>
</div>
</div>
</div>
</div>
<div id="profile" class="layui-card">
<div class="layui-card-body">
<h2>个人信息</h2>
<div class="clear">
<div class="layui-col-md3">
<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>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">微信号</div>
<div class="contract-detail">{$user.wechat|default='Tony'}</div>
</div>
<div class="layui-col-md3">
<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>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">登录IP</div>
<div class="contract-detail">{$user.login_ip}</div>
</div>
</div>
<div class="clear">
<div class="layui-col-md3">
<div class="contract-title">登陆次数</div>
<div class="contract-detail">{$user.login_count}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">用户组</div>
<div class="contract-detail">{$user.group.title}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">加入时间</div>
<div class="contract-detail">{$user.create_time}</div>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">所在住址</div>
<div class="contract-detail">{$user.address}</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">登录日志</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="nob">
<thead>
<tr>
<th>登录时间</th>
<th>登录IP</th>
<th>&nbsp;状态</th>
</tr>
</thead>
<tbody>
<php> $_user_log = \app\common\model\system\UserLog::where('login_id',$user['id'])->limit(8)->order('id desc')->select();</php>
<volist name="$_user_log" id="vo">
<tr>
<td>{$vo.create_time}</td>
<td>{$vo.login_ip}</td>
<td><span <eq name="$vo['status']" value="0">style="color:red;"</eq> >{$vo.error}</span></td>
</tr>
</volist>
</tbody>
</table>
</div>
</div>
</div>
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">快捷方式</div>
<div class="layui-card-body layui-row layui-col-space10" style="max-height: 146px;overflow: auto">
<div class="layui-col-md4">
<div class="speed-entry-item" data-url="/index/user/profile">
<i class="layui-icon fa-user"></i> 我的主页
</div>
</div>
<div class="layui-col-md4">
<div class="speed-entry-item" data-url="/index/user/message">
<i class="layui-icon fa-comment"></i> 站内消息
</div>
</div>
<div class="layui-col-md4">
<div class="speed-entry-item" data-url="/index/user/security">
<i class="layui-icon fa-get-pocket"></i> 安全中心
</div>
</div>
{:get_plugin_menu_entry('tabs')}
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">应用插件</div>
<div class="layui-card-body">
<div id="pluginApp" class="layui-carousel">
<div id="appPluginList" carousel-item>
<div><img src="/static/images/plugin-banner.png"></div>
<div><img src="/static/images/plugin-redis.png"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">🏷️ 新闻公告</div>
<ul id="newsList" class="news-list">
{$newsHtml|raw}
</ul>
</div>
<div class="layui-card">
<div class="layui-card-header">APP KEY</div>
<div id="appkey" class="layui-card-body">
<notempty name="user.app_id">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">app_id</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$user.app_id}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">app_secret</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$user.app_secret}</div>
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn-normal" lay-ajax=""
data-url="/index/user/appid" data-reload="self">更换APPKEY
</button>
</div>
</div>
<else/>
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">还没有生成appKey,请点击按钮生成!</div>
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn-normal" lay-ajax=""
data-url="/index/user/appid" data-reload="self">生成APPKEY
</button>
</div>
</div>
</notempty>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header" style="color: red">活跃用户 (TOP)</div>
<div class="layui-card-body" id="cardInfoList">
<ul class="cardInfoUsers">
<volist name="userList" id="vo">
<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>
</li>
</volist>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- // 修改用户昵称 -->
<script type="text/html" id="nickname">
<div class="layui-fluid layui-bg-white">
<form class="layui-form layui-form-fixed" action="/index/user/profile">
<div class="layui-form-item">
<label class="layui-form-label">{:__('用户昵称')}</label>
<div class="layui-input-inline">
<input name="nickname" autocomplete="off" placeholder="{:__('请输入昵称')}" type="text"
class="layui-input" lay-verify="required"/>
</div>
</div>
<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="submitPage" data-reload="parent" lay-submit>
{:__('提交')}
</button>
</div>
</form>
</div>
</script>
<script>
layui.use(['jquery', 'upload','carousel'], function () {
var $ = layui.jquery;
var upload = layui.upload;
var carousel = layui.carousel;
// API请求热门插件
$.ajax({
type: 'GET',
url: 'https://api.swiftadmin.net/plugin/recommend',
data: {type: 'hot'},
dataType: 'json',
success: function (res) {
if (res.code === 200) {
$('#appPluginList').html(res.data);
}
carousel.render({
elem: '#pluginApp'
,height: '120px'
,interval: 3000
,anim: 'fade'
});
},
error: function () {}
})
$('.speed-entry-item').click(function (e) {
let url = $(this).data('url');
if (typeof url == 'undefined') {
layer.msg('功能开发中...');
return false;
}
let m = parent.layui.$('.layui-nav-tree li [lay-href="' + url + '"]');
parent.layui.$(m).parents('.layui-nav-item').addClass('layui-nav-itemed');
parent.layui.$(m).trigger('click');
})
})
</script>

View File

@@ -0,0 +1,185 @@
<layout name="layout:layout"/>
<!-- 内容主体区域 -->
<style>
.alert-warn {
background: #fff3eb;
border: 1px solid #ffdac2;
border-radius: 2px;
color: #ff6600;
font-size: 12px;
padding: 10px 30px;
}
.choose-box {
overflow: hidden;
padding: 25px;
}
.choose-box #tip {
margin-bottom: 15px;
}
.choose-item {
cursor: pointer;
border: 1px solid #e1e4e6;
border-radius: 3px;
margin-right: 20px;
padding: 28px 28px 28px 50px;
}
.choose-item:hover {
border-color: #1890ff;
}
.choose-item:hover i {
color: #1890ff;
}
.svg {
margin-top: 23px;
}
.fa-wechat, .fa-mobile-phone {
font-size: 4em;
}
.subtitle {
margin-top: 10px;
font-size: 18px;
clear: both;
display: block;
}
.captcha img {
border: 1px solid #d9d9d9;
background-color: #fff;
border-radius: 3px;
width: 116px;
}
#proves {
padding: 65px;
overflow: hidden;
}
#proves .auHead, #proves .auIntro {
margin: 0px 10px;
}
#proves h2 {
margin-bottom: 15px;
}
#proves .text-muted {
color: #a0a2a3;
}
#proves p {
margin-bottom: 10px;
}
</style>
<div id="content">
<div class="layui-card">
<div class="layui-card-header "><h5>实名认证</h5></div>
<div class="layui-card-body ">
<div class="alert-warn">
<span>
<i class="layui-icon fa-info-circle"></i>
根据《中华人民共和国网络安全法》等网络安全相关法律法规规定,及按网监,公安等有关监管单位要求,互联网计算资源用户须完成用户实名认证才能使用。
请您认真填写相关实名认证信息,完成实名认证申请。
</span>
</div>
<empty name="prove">
<div class="choose-box layui-row layui-col-space10">
<div id="tip">请您从以下认证方式中选择一种:</div>
<div class="layui-col-md4 choose-item " lay-open data-title="实名认证" data-url="#author" data-area="520px,390px">
<div class="layui-col-md2">
<div class="svg"><i class="layui-icon fa-mobile-phone"></i></div>
</div>
<div class="layui-col-md10">
<span class="subtitle">手机号码 验证实名</span>
<span class="intro">注:手机号码必须与实名认证人信息一致</span>
</div>
</div>
<div class="layui-col-md4 choose-item" onclick="layui.layer.msg('暂未支持','info')">
<div class="layui-col-md2">
<div class="svg"><i class="layui-icon fa-wechat"></i></div>
</div>
<div class="layui-col-md10">
<span class="subtitle">微信人脸 识别认证</span>
<span class="intro">注:请使用本人微信进行人脸识别认证</span>
</div>
</div>
</div>
<else/>
<div id="proves">
<div class="auHead fl"><svg t="1667563336182" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2727" width="200" height="200"><path d="M0 0h1024v1024H0z" fill="#FFFFFF" p-id="2728"></path><path d="M151.272727 197.818182m93.090909 0l538.507637 0q93.090909 0 93.090909 93.090909l0 428.520727q0 93.090909-93.090909 93.090909l-538.507637 0q-93.090909 0-93.090909-93.090909l0-428.520727q0-93.090909 93.090909-93.090909Z" fill="#23C588" p-id="2729"></path><path d="M366.545455 458.624a52.363636 52.363636 0 1 0-52.363637-52.363636 52.421818 52.421818 0 0 0 52.363637 52.363636m0 46.545455a98.909091 98.909091 0 1 1 98.90909-98.909091 98.909091 98.909091 0 0 1-98.90909 98.909091z" fill="#FFFFFF" p-id="2730"></path><path d="M360.727273 551.714909a69.899636 69.899636 0 0 0-69.818182 69.818182v46.545454h151.272727v-46.545454a69.899636 69.899636 0 0 0-69.818182-69.818182h-11.636363m0-46.545454h11.636363a116.363636 116.363636 0 0 1 116.363637 116.363636v46.545454a46.545455 46.545455 0 0 1-46.545455 46.545455H290.909091a46.545455 46.545455 0 0 1-46.545455-46.545455v-46.545454a116.363636 116.363636 0 0 1 116.363637-116.363636z" fill="#FFFFFF" p-id="2731"></path><path d="M758.027636 430.743273h-186.181818a23.272727 23.272727 0 0 1-23.272727-23.272728 23.272727 23.272727 0 0 1 23.272727-23.272727h186.181818a23.272727 23.272727 0 0 1 23.272728 23.272727 23.272727 23.272727 0 0 1-23.272728 23.272728z" fill="#FFFFFF" p-id="2732"></path><path d="M758.027636 535.470545h-186.181818a23.272727 23.272727 0 0 1-23.272727-23.272727 23.272727 23.272727 0 0 1 23.272727-23.272727h186.181818a23.272727 23.272727 0 0 1 23.272728 23.272727 23.272727 23.272727 0 0 1-23.272728 23.272727z" fill="#FFFFFF" p-id="2733"></path><path d="M758.027636 640.197818h-186.181818a23.272727 23.272727 0 0 1-23.272727-23.272727 23.272727 23.272727 0 0 1 23.272727-23.272727h186.181818a23.272727 23.272727 0 0 1 23.272728 23.272727 23.272727 23.272727 0 0 1-23.272728 23.272727z" fill="#FFFFFF" p-id="2734"></path></svg> </div>
<div class="auIntro fl">
<h2>恭喜您已通过实名认证</h2>
<p><span class="text-muted">认证途径:</span>身份证实名</p>
<p><span class="text-muted">真实姓名:</span>{:hide_str($user['name'],0,1)}</p>
<p><span class="text-muted">认证时间:</span>{$user.prove_time}</p>
<p><span class="text-muted">证件号码:</span>{:hide_str($user['idcard'],3,8)}</p>
<p>
<span class="text-muted">如果您的认证信息发生变更,可</span>
<a id="edit-verify">联系管理员修改认证资料 &gt;</a>
</p>
</div>
</div>
</empty>
</div>
</div>
</div>
<!-- // 实名认证 -->
<script type="text/html" id="author">
<div class="layui-fluid layui-bg-white">
<form class="layui-form layui-form-fixed" action="/index/user/certification">
<div class="layui-form-item">
<label class="layui-form-label">{:__('手机号')}</label>
<div class="layui-input-inline" style="width: 320px">
<input name="mobile" placeholder="{:__('请输入手机号')}" type="text" autocomplete="on"
class="layui-input" lay-verify="required|phone"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{:__('真实姓名')}</label>
<div class="layui-input-inline" style="width: 320px">
<input name="name" placeholder="{:__('请输入真实姓名')}" type="text" autocomplete="on" class="layui-input" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{:__('身份证号码')}</label>
<div class="layui-input-inline" style="width: 320px">
<input name="idCard" placeholder="{:__('请输入身份证号码')}" type="text" autocomplete="on" class="layui-input" lay-verify="required|identity"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">{:__('验证码')}</label>
<div class="layui-input-inline">
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" autocomplete="on" class="layui-input" lay-verify="required" maxlength="10"/>
</div>
<div class="captcha"><a href="javascript:;"><img src="{:captcha_src()}" height="31" id="captchaImg" alt="{:__('验证码')}"/></a></div>
</div>
<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="true" lay-filter="submitPage" lay-submit>{:__('提交')}</button>
</div>
</form>
</div>
</script>
<script>
layui.use(['table', 'jquery'], function () {
let $ = layui.jquery, captchaUrl = '{:captcha_src()}';
$(document).on('click', '#captchaImg', function () {
$(this).attr('src', captchaUrl + '?rand=' + Math.random())
})
})
</script>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>修改密码</title>
@@ -8,7 +8,7 @@
<body>
<div class="layui-card-body">
<form action="/user/changePwd" class="layui-form layui-form-fixed">
<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>

View File

@@ -2,7 +2,7 @@
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-fluid ">
<form class="layui-form layui-form-fixed" action="/user/email">
<form class="layui-form layui-form-fixed" action="/index/user/email">
<div class="layui-form-item">
<label class="layui-form-label">{:__('邮箱地址')}</label>
@@ -17,7 +17,7 @@
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input"
autocomplete="off" lay-verify="required" maxlength="10"/>
</div>
<button class="layui-btn layui-btn-normal" type="button" lay-ajax data-url="/user/email"
<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>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 用户登录</title>
@@ -27,7 +27,7 @@
</style>
<div class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/user/forgot" method="post" >
<form class="layui-form layui-form-fixed" action="/index/user/forgot" method="post" >
<input type="hidden" name="__token__" value="{:token()}"/>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> {:__('手机/邮箱')}</label>

View File

@@ -28,9 +28,9 @@
<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="/user/changepwd" lay-area="470px,330px" href="javascript:;">修改密码</a>
<dd><a lay-open lay-title="修改密码" lay-url="/index/user/changepwd" lay-area="470px,330px" href="javascript:;">修改密码</a>
</dd>
<dd><a href="/user/logout" >退出</a></dd>
<dd><a href="/index/user/logout" >退出</a></dd>
</dl>
</li>
<li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>控制台 | 用户中心</title>
@@ -9,9 +9,9 @@
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo layui-side-body layui-hide-xs layui-bg-black">
<!-- // 可以增加LOGO-->
<!--// 可以增加LOGO-->
<img src="/static/system/images/logo.png" style="margin-bottom: 8px;margin-right: 10px" alt="logo" width="22" height="22" >
<span class="logo-text">用户中心</span>
<span class="logo-text">会员中心</span>
</div>
<ul class="layui-nav layui-layout-left">
<li id="shrink" class="layui-nav-item layui-show-xs-inline-block" >
@@ -26,26 +26,26 @@
</a>
</li>
<li class="layui-nav-item" >
<li class="layui-nav-item">
<a href="javascript:;" id="notice">
<i class="layui-icon fa-bell-o"></i>
<span class="layui-badge-dot"></span>
<div id="unread" data-count="{$unread|default='0'}"></div>
<empty name="$unread">
<i class="layui-icon fa-bell-o"></i>
<else/>
<i class="layui-icon fa-bell"></i>
<span class="layui-badge-dot"></span>
</empty>
</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 data-title="修改密码" data-url="/user/changepwd" data-area="470px,330px" href="javascript:;">修改密码</a>
<dd><a lay-open data-title="修改密码" data-url="/index/user/changepwd" data-area="470px,330px" href="javascript:;">修改密码</a>
</dd>
<dd><a href="/user/logout">退出</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 id="skin" class="layui-icon fa-moon-o"></i>
</a>
</li>
</ul>
</div>
<div class="layui-side layui-side-body layui-bg-black">
@@ -57,12 +57,12 @@
<div class="layui-body">
<!-- 内容主体区域 -->
<iframe id="iframe" src="/user/profile" frameborder="0" class="layui-layer-load" onload="this.className='';" ></iframe>
<iframe id="iframe" src="/index/user/center" frameborder="0" class="layui-layer-load" onload="this.className='';" ></iframe>
</div>
<include file="user:footer"/>
</div>
<script !src="">
<script>
layui.use(['jquery','upload'],function(){
let $ = layui.jquery;
@@ -88,14 +88,14 @@
// 上传头像
upload.render({
elem: '.layui-user-avatar'
,url: '/user/avatars'
,url: '/index/user/avatars'
,method: 'post'
,accept: 'file'
,before: function(res) {
layer.msg('上传中');
},done: function(res, index, upload) {
// 上传成功
if (res.code == 200) {
if (res.code === 200) {
layer.msg(res.msg);
$('#imgHead img').attr('src',res.url);
} else {
@@ -138,27 +138,7 @@
$('#skin').removeClass('fa-moon-o').addClass('fa-sun-o');
}
// 切换皮肤
$('#skin').on('click',function () {
let value = $(this).hasClass('fa-moon-o');
console.log(value)
if (value) {
$(this).removeClass('fa-moon-o').addClass('fa-sun-o');
$('.layui-side-body').removeClass('layui-bg-black').addClass('layui-bg-white');
layui.data('skin',{
key: 'theme',
value: 'layui-bg-white'
});
} else {
$(this).removeClass('fa-sun-o').addClass('fa-moon-o');
$('.layui-side-body').removeClass('layui-bg-white').addClass('layui-bg-black');
layui.data('skin',{
key: 'theme',
value: 'layui-bg-black'
});
}
})
bellMessage($('#unread').data('count'));
})
</script>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>SwiftAdmin 用户登录</title>
@@ -27,7 +27,7 @@
<a href="{:url('/third/login',['type'=>'weibo'])}&ref={$referer}" class="sina" target="_top"></a>
</span>
</div>
<form class="layui-form" action="/user/login" method="post" style="height: auto">
<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">
@@ -49,7 +49,7 @@
<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="/user/forgot" class="forget-link fr" style="margin-top: 7px;">{:__('忘记密码?')}</a>
<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">

View File

@@ -0,0 +1,35 @@
<layout name="layout:layout" />
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-card">
<div class="layui-card-header">登录日志</div>
<!-- // 创建数据实例 -->
<div class="layui-card-body">
<table id="lay-tableList" lay-filter="lay-tableList"></table>
</div>
</div>
</div>
<script>
layui.use(['table'], function () {
var table = layui.table;
/*
* 初始化表格
*/
var isTable = table.render({
elem: "#lay-tableList"
, url: "{:url('/user/login_log')}"
, page: true
, limit: 20
, cols: [[
{field: 'nickname', align: 'left',title: '{:__("登录帐号")}'},
{field: 'login_ip', align: 'center', title: '{:__("登录IP")}'},
{field: 'login_os', align: 'center', title: '{:__("操作系统")}'},
{field: 'login_browser', align: 'center', title: '{:__("登录代理")}'},
{field: 'error', align: 'center', title: '{:__("登录状态")}'},
{field: 'create_time', align: 'center', title: '{:__("登录时间")}'},
]]
})
})
</script>

View File

@@ -0,0 +1,88 @@
<layout name="layout:layout" />
<!-- 内容主体区域 -->
<style>
.layui-table-text-red {
font-weight: bold;
}
</style>
<div id="content">
<div class="layui-row" >
<div id="cardInfo" class="layui-card"> <i class="layui-icon fa-bullhorn"></i> 短消息是本站系统给您发送的提醒消息,请务必阅读。如因自身未阅读导致出现的相关问题后果自负!</div>
<div class="layui-card" style="padding-top: 10px">
<!-- // 默认操作按钮 -->
<div class="layui-card-header layadmin-card-header-auto ">
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-inline">
<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>
</div>
</div>
</div>
</div>
<!-- // 创建数据实例 -->
<table id="lay-tableList" lay-filter="lay-tableList"></table>
</div>
</div>
</div>
<script>
layui.use(['table','jquery'], function () {
let $ = layui.jquery;
let table = layui.table;
/*
* 初始化表格
*/
let isTable = table.render({
elem: "#lay-tableList"
, url: "{:url('/user/message')}"
, page: true
, limit: 20
, cols: [[
{type: 'checkbox', width: 45},
{
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" >';
if (e.status === 0) {
title += '<i class="layui-icon fa-envelope"></i> ';
} else {
title += '<i class="layui-icon fa-envelope-o"></i> ';
}
title += e.title;
title += '</a>';
return title;
}, title: '{:__("消息标题")}'
},
{field: 'send_ip', align: 'center',width: 220, title: '{:__("来源IP")}'},
{field: 'type', align: 'center', width: 130, title: '{:__("消息类型")}'},
{field: 'create_time', align: 'center', width: 200, title: '{:__("创建时间")}'},
]]
})
$('.layui-btn-post').click(function () {
let status = $(this).data('status');
$('.layui-btn-post').removeClass('layui-btn-normal').addClass('layui-btn-primary');
$(this).addClass('layui-btn-normal').removeClass('layui-btn-primary');
isTable.reload({
where: {status: status},
page: {curr: 1}
});
});
$('body').on('click','.layui-table-text-red',function () {
$(this).removeClass('layui-table-text-red');
});
})
</script>

View File

@@ -2,7 +2,7 @@
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/user/mobile">
<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">
@@ -16,7 +16,7 @@
<input name="captcha" placeholder="{:__('请输入验证码')}" type="text" class="layui-input"
autocomplete="off" lay-verify="required" maxlength="10"/>
</div>
<button class="layui-btn layui-btn-normal" type="button" lay-ajax data-url="/user/mobile"
<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>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>消息管理 | {$site_name}</title>

View File

@@ -1,246 +1,158 @@
<layout name="layout:layout"/>
<!-- 内容主体区域 -->
<style>
.red {
color: red;
}
.mt30 {
margin-top: 30px;
}
.layui-form {
padding-top: 10px;
}
@media screen and (min-width: 1024px) {
.layui-input-inline {
min-width: 260px!important;
}
.address {
min-width: 639px!important;
}
}
</style>
<div id="content">
<div class="layui-row layui-col-space20">
<div class="layui-col-md9">
<div class="layui-card">
<div class="layui-card-body goindex">
<div class="layui-col-md8">
<div class="tips"> Hi{$user.nickname} <span class="regular"> 下午好,今天是你加入的第 {$user.create_time|distance_day} 天~</span>
</div>
</div>
<div class="layui-col-md4">
</div>
</div>
</div>
<div id="profile" class="layui-card">
<div class="layui-card-body">
<h2>个人信息</h2>
<div class="clear">
<div class="layui-col-md3">
<div class="contract-title">手机</div>
<div class="contract-detail">+86 {$user.mobile}
<i class="layui-icon fa-edit" title="编辑" lay-open data-title="修改手机"
data-url="/user/mobile" data-area="500px,300px"></i>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">微信号</div>
<div class="contract-detail">{$user.wechat|default='--'}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">办公室邮箱</div>
<div class="contract-detail">{$user.email}
<i class="layui-icon fa-edit" title="编辑" lay-open data-title="修改邮箱"
data-url="/user/email" data-area="500px,300px"></i>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">登录IP</div>
<div class="contract-detail">{$user.login_ip}</div>
</div>
</div>
<div class="clear">
<div class="layui-col-md3">
<div class="contract-title">登陆次数</div>
<div class="contract-detail">{$user.login_count}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">用户组</div>
<div class="contract-detail">{$user.group.title}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">积分</div>
<div class="contract-detail">{$user.score}</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">加入时间</div>
<div class="contract-detail">{$user.create_time}</div>
</div>
</div>
<div class="layui-col-md3">
<div class="contract-title">所在住址</div>
<div class="contract-detail">{$user.address}</div>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">我的帖子</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="nob">
<thead>
<tr>
<th>标题</th>
<th>回答数</th>
<th>发表时间</th>
<th>访问量</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<div class="layui-row">
<div id="cardInfo" class="layui-card">
<span>温馨提示:</span>
<span>1、请务必牢记您所填写的信息</span>
<span>2、姓名、电话号码、公司名称、微信号等敏感信息请谨慎填写</span>
</div>
<div class="layui-col-md3">
<div id="account" class="layui-card">
<div class="layui-card-body">
<div id="imgHead" class="layui-user-avatar">
<img src="{$user.avatar}" alt="{$user.nickname}" class="avatar">
</div>
<div class="nickname">
{$user.nickname}
<span class="edits">
<i class="layui-icon fa-edit" lay-open data-title="修改昵称" data-url="#nickname" data-area="398px,230px"></i>
</span>
</div>
<div class="intro">{$user.heart}</div>
<div id="thrid" class="layui-input-inline">
<if check_user_third(
'qq',$user['id']) >
<a lay-ajax data-url="{:url('/third/unbind',['type'=> 'qq'])}" title="点击解绑" type="button"
class="layui-btn layui-btn-sm"><i
class="layui-icon layui-icon-login-qq"></i></a>
<else/>
<a href="{:url('/third/bind?type=qq&ref=/user/index')}" title="点击绑定" type="button" target="_top"
class="layui-btn layui-btn-sm layui-bind-third"><i
class="layui-icon layui-icon-login-qq"></i></a>
</if>
<if check_user_third(
'weixin',$user['id']) >
<a lay-ajax data-url="{:url('/third/unbind?type=weixin')}" title="点击解绑" type="button"
class="layui-btn layui-btn-sm"><i
class="layui-icon layui-icon-login-wechat"></i></a>
<else/>
<a href="{:url('/third/bind')}?type=weixin&ref=/user/index" title="点击绑定" type="button"
target="_top"
class="layui-btn layui-btn-sm layui-bind-third"><i
class="layui-icon layui-icon-login-wechat"></i></a>
</if>
<if check_user_third(
'weibo',$user['id']) >
<a lay-ajax data-url="{:url('/third/unbind?type=weibo')}" title="点击解绑" type="button"
class="layui-btn layui-btn-sm"><i
class="layui-icon layui-icon-login-weibo"></i></a>
<else/>
<a href="{:url('/third/bind')}?type=wiebo&ref=/user/index" title="点击绑定" type="button"
target="_top"
class="layui-btn layui-btn-sm layui-bind-third"><i
class="layui-icon layui-icon-login-weibo"></i></a>
</if>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">APP KEY</div>
<div id="appkey" class="layui-card-body">
<notempty name="user.app_id">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">app_id</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$user.app_id}</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">app_secret</label>
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">{$user.app_secret}</div>
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn-normal" lay-ajax=""
data-url="/user/appid" data-reload="self">更换APPKEY
</button>
</div>
<div class="layui-card">
<div class="layui-card-header">我的资料</div>
<div class="layui-card-body" >
<form action="/index/user/center" class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label mt30"><span class="red">*</span> 用户头像</label>
<div id="imgHead" class="layui-user-avatar">
<img src="{$user.avatar}" alt="{$user.nickname}" class="avatar">
</div>
<else/>
<div class="layui-form">
<div class="layui-form-item">
<div class="layui-input-block">
<div class="layui-form-mid layui-word-aux">还没有生成appKey,请点击按钮生成!</div>
</div>
</div>
</div>
<div class="layui-form-item">
<button type="submit" class="layui-btn layui-btn-normal" lay-ajax=""
data-url="/user/appid" data-reload="self">生成APPKEY
</button>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 用户昵称</label>
<div class="layui-input-inline">
<input type="text" name="nickname" placeholder="用户昵称" class="layui-input" value="{$user.nickname}">
</div>
</notempty>
</div>
</div>
<label class="layui-form-label"><span class="red">*</span> 真实姓名</label>
<div class="layui-input-inline">
<input type="text" name="name" placeholder="真实姓名" class="layui-input" value="{$user.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 性别</label>
<div class="layui-input-inline">
<input name="gender" type="radio" value="1" title="男" <eq name="$user['gender']" value="1">checked</eq>>
<input name="gender" type="radio" value="0" title="女" <eq name="$user['gender']" value="0">checked</eq>>
</div>
<label class="layui-form-label"><span class="red">*</span> 身份证号码</label>
<div class="layui-input-inline">
<input name="idcard" placeholder="请输入身份证号" class="layui-input" value="{$user.idcard}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 手机号码</label>
<div class="layui-input-inline">
<input class="layui-input layui-disabled" disabled value="{$user.mobile|default='未绑定'}">
</div>
<label class="layui-form-label"><span class="red">*</span> 邮箱地址</label>
<div class="layui-input-inline">
<input class="layui-input layui-disabled" disabled value="{$user.email|default='member@domain.com'}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">用户心情</label>
<div class="layui-input-inline">
<input name="heart" placeholder="请输入用户心情" class="layui-input" value="{$user.heart}">
</div>
<label class="layui-form-label"><span class="red">*</span> 邮政编码</label>
<div class="layui-input-inline">
<input name="zipcode" placeholder="请输入邮政编码" class="layui-input" value="{$user.zipcode}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="red">*</span> 家庭住址</label>
<div class="layui-input-inline address">
<input name="address" placeholder="请输入家庭住址" class="layui-input" value="{$user.address}">
</div>
</div>
<div class="layui-form-item" style="margin-top: 22px;text-align: center">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button type="submit" class="layui-btn layui-btn-normal" lay-submit="" lay-filter="submit">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- // 修改用户昵称 -->
<script type="text/html" id="nickname">
<div class="layui-fluid layui-bg-white">
<form class="layui-form layui-form-fixed" action="/user/profile">
<div class="layui-form-item">
<label class="layui-form-label">{:__('用户昵称')}</label>
<div class="layui-input-inline">
<input name="nickname" autocomplete="off" placeholder="{:__('请输入昵称')}" type="text"
class="layui-input" lay-verify="required"/>
</div>
</div>
<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="submitPage" data-reload="parent" lay-submit>
{:__('提交')}
</button>
</div>
</form>
</div>
</script>
<script>
layui.use(['jquery', 'upload'], function () {
layui.use(['jquery', 'upload','form'], function () {
var $ = layui.jquery;
var upload = layui.upload;
var form = layui.form;
// 上传头像
upload.render({
elem: '.layui-user-avatar'
, url: '/user/avatar?action=avatar' // 默认的上传地址
, url: '/index/user/avatar?action=avatar' // 默认的上传地址
, method: 'post'
, accept: 'image'
, before: function (res) {
layer.msg('上传中');
}, done: function (res, index, upload) {
// 上传成功
if (res.code === 200) {
$('.avatar').attr('src', res.url + '?' + parseInt(100 * Math.random()));
return layer.msg(res.msg);
}
layer.msg(res.msg, 'error');
}
})
//监听提交
form.on('submit(submit)', function(data){
$.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>

View File

@@ -2,7 +2,7 @@
<!-- 内容主体区域 -->
<div id="content">
<div class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/user/protection">
<form class="layui-form layui-form-fixed" action="/index/user/protection">
<div class="layui-form-item">
<label class="layui-form-label">{:__('密保问题')}</label>
<div class="layui-input-inline" style="width: 260px">

View File

@@ -21,7 +21,7 @@
}
</style>
<div id="register" class="layui-fluid">
<form class="layui-form layui-form-fixed" action="/user/register" method="post">
<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>

View File

@@ -1,4 +1,35 @@
<layout name="layout:layout"/>
<style>
.u-box {
margin-left: 35px;
}
@media screen and (max-width: 1024px) {
.setting-intro {
display: none;
}
.u-box {
margin-left: 10px;
}
}
@media screen and (max-width: 440px) {
.u-box {
width: 190px;
}
#user-detail .layui-progress {
width: 110px;
}
.text-stress {
display: none;
}
}
</style>
<div id="content">
<div class="layui-card">
<div class="layui-card-header"><h5>安全设置</h5></div>
@@ -7,8 +38,8 @@
<div class="layui-user-avatar fl" >
<img src="{$user.avatar}" alt="" width="80">
</div>
<div class="fl" style="margin-left: 35px">
<div class="u-info"><span class="label">会员ID:</span>{$user.id}</div>
<div class="u-box fl">
<div class="u-info"><span class="label">会员UID:</span>{$user.id|supplement_id}</div>
<div class="u-info"><span class="label">注册日期:</span>{$user.create_time}</div>
<div class="u-info">
<span class="label">安全级别:</span>
@@ -29,7 +60,7 @@
<span class="setting-intro">安全性高的密码可以使账户更安全;互联网账号存在被盗风险,建议您定期更换密码</span>
</div>
<div class="setting-operate fr">
<a lay-open="" data-title="修改密码" data-url="/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>
@@ -53,7 +84,7 @@
</div>
<div class="setting-operate fr">
<a lay-open data-title="修改手机" data-url="/user/mobile" data-area="500px,300px">修改</a>
<a lay-open data-title="修改手机" data-url="/index/user/mobile" data-area="500px,300px">修改</a>
</div>
</div>
@@ -77,7 +108,7 @@
</div>
<div class="setting-operate fr">
<a lay-open data-title="修改邮箱" data-url="/user/email" data-area="500px,300px">修改</a>
<a lay-open data-title="修改邮箱" data-url="/index/user/email" data-area="500px,300px">修改</a>
</div>
</div>
@@ -95,7 +126,7 @@
</div>
<div class="setting-operate fr">
<a lay-open data-title="设置密保" data-url="/user/protection" data-area="500px,300px">设置</a>
<a lay-open data-title="设置密保" data-url="/index/user/protection" data-area="500px,300px">设置</a>
</div>
</div>

View File

@@ -1,15 +1,23 @@
<!--// 初始化菜单-->
<ul class="layui-nav layui-nav-tree" lay-filter="master">
<li class="layui-nav-item layui-this">
<a lay-href="/user/profile">控制台</a>
</li>
<!--// 前台菜单-->
{:get_plugin_menu()}
<li class="layui-nav-item">
<a class="#" href="javascript:;">账号设置</a>
<a class="#" href="javascript:;">Dashboard</a>
<dl class="layui-nav-child">
<dd><a lay-href="/user/security">安全设置</a></dd>
<dd class="layui-this"><a lay-href="/index/user/center">控制台</a></dd>
</dl>
</li>
</ul>
<!--// 插件菜单开始-->
{:get_plugin_menu_entry()}
<!--// 插件菜单结束-->
<li class="layui-nav-item">
<a class="#" href="javascript:;">我的账户</a>
<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/certification">实名认证</a></dd>
<dd><a lay-href="/index/user/security">安全中心</a></dd>
</dl>
</li>
</ul>

View File

@@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>查看消息</title>
<include file="public:header"/>
</head>
<body>
<style>
h1 {
font-family: "helvetica neue", PingFangSC-Light, arial, "hiragino sans gb", "microsoft yahei ui", "microsoft yahei", simsun, sans-serif;
font-size: 20px;
}
.layui-card-header {
height: auto;
}
.layui-text {
padding: 10px!important;
text-indent: 2em;
line-height: 24px;
}
.layui-text p {
line-height: 24px;
}
</style>
<div class="layui-fluid">
<div id="unread" data-count="{$unread|default='0'}"></div>
<div class="layui-card">
<div class="layui-card-header">
<h1>{$info.title}</h1>
<p style="color: #3464ff">{$info.nickname|default='系统'} 于 {$info.create_time}</p>
</div>
<div class="layui-card-body layui-text">
{$info.content|raw}
</div>
</div>
</div>
</body>
<script>
layui.use('jquery', function () {
let $ = layui.jquery;
let unread = $('#unread').data('count');
if (!unread) {
top.layui.$('#notice').find('.layui-badge-dot').hide();
top.layui.$('#notice').find('.fa-bell').removeClass('fa-bell').addClass('fa-bell-o');
}
// 更新消息数量
bellMessage(unread);
})
</script>
</html>