no message
This commit is contained in:
parent
0b12ab55c0
commit
14a5ef5610
347
app/Http/Controllers/Api/SystemController.php
Executable file
347
app/Http/Controllers/Api/SystemController.php
Executable file
@ -0,0 +1,347 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Module\Base;
|
||||||
|
use Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @apiDefine system
|
||||||
|
*
|
||||||
|
* 系统
|
||||||
|
*/
|
||||||
|
class SystemController extends AbstractController
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/setting 01. 获取设置、保存设置
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName setting
|
||||||
|
*
|
||||||
|
* @apiParam {String} type
|
||||||
|
* - get: 获取(默认)
|
||||||
|
* - save: 保存设置(参数:reg、login_code)
|
||||||
|
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function setting()
|
||||||
|
{
|
||||||
|
$type = trim(Request::input('type'));
|
||||||
|
if ($type == 'save') {
|
||||||
|
if (env("SYSTEM_SETTING") == 'disabled') {
|
||||||
|
return Base::retError('当前环境禁止修改!');
|
||||||
|
}
|
||||||
|
$user = User::authE();
|
||||||
|
if (Base::isError($user)) {
|
||||||
|
return $user;
|
||||||
|
} else {
|
||||||
|
$user = User::IDE($user['data']);
|
||||||
|
}
|
||||||
|
if (!$user->isAdmin()) {
|
||||||
|
return Base::retError('权限不足!');
|
||||||
|
}
|
||||||
|
$all = Request::input();
|
||||||
|
foreach ($all AS $key => $value) {
|
||||||
|
if (!in_array($key, ['reg', 'login_code'])) {
|
||||||
|
unset($all[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$setting = Base::setting('system', Base::newTrim($all));
|
||||||
|
} else {
|
||||||
|
$setting = Base::setting('system');
|
||||||
|
}
|
||||||
|
//
|
||||||
|
$setting['reg'] = $setting['reg'] ?: 'open';
|
||||||
|
$setting['login_code'] = $setting['login_code'] ?: 'auto';
|
||||||
|
//
|
||||||
|
return Base::retSuccess('success', $setting ?: json_decode('{}'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/info 02. 获取终端详细信息
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName get__info
|
||||||
|
*
|
||||||
|
* @apiParam {String} key key值
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function get__info()
|
||||||
|
{
|
||||||
|
if (Request::input("key") !== env('APP_KEY')) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return Base::retSuccess('success', [
|
||||||
|
'ip' => Base::getIp(),
|
||||||
|
'ip-info' => Base::getIpInfo(Base::getIp()),
|
||||||
|
'ip-gcj02' => Base::getIpGcj02(Base::getIp()),
|
||||||
|
'ip-iscn' => Base::isCnIp(Base::getIp()),
|
||||||
|
'header' => Request::header(),
|
||||||
|
'token' => Base::getToken(),
|
||||||
|
'url' => url('') . Base::getUrl(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/ip 03. 获取IP地址
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName get__ip
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function get__ip() {
|
||||||
|
return Base::getIp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/cnip 04. 是否中国IP地址
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName get__cnip
|
||||||
|
*
|
||||||
|
* @apiParam {String} ip IP值
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function get__cnip() {
|
||||||
|
return Base::isCnIp(Request::input('ip'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/ipgcj02 05. 获取IP地址经纬度
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName get__ipgcj02
|
||||||
|
*
|
||||||
|
* @apiParam {String} ip IP值
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function get__ipgcj02() {
|
||||||
|
return Base::getIpGcj02(Request::input("ip"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/ipinfo 06. 获取IP地址详细信息
|
||||||
|
*
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName get__ipinfo
|
||||||
|
*
|
||||||
|
* @apiParam {String} ip IP值
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function get__ipinfo() {
|
||||||
|
return Base::getIpInfo(Request::input("ip"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} api/system/imgupload 10. 上传图片
|
||||||
|
*
|
||||||
|
* @apiDescription 需要token身份
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName imgupload
|
||||||
|
*
|
||||||
|
* @apiParam {String} image64 图片base64
|
||||||
|
* @apiParam {String} filename 文件名
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function imgupload()
|
||||||
|
{
|
||||||
|
if (User::token2userid() === 0) {
|
||||||
|
return Base::retError('身份失效,等重新登录!');
|
||||||
|
}
|
||||||
|
$scale = [intval(Request::input('width')), intval(Request::input('height'))];
|
||||||
|
if (!$scale[0] && !$scale[1]) {
|
||||||
|
$scale = [2160, 4160, -1];
|
||||||
|
}
|
||||||
|
$path = "uploads/picture/" . User::token2userid() . "/" . date("Ym") . "/";
|
||||||
|
$image64 = trim(Base::getPostValue('image64'));
|
||||||
|
$fileName = trim(Base::getPostValue('filename'));
|
||||||
|
if ($image64) {
|
||||||
|
$data = Base::image64save([
|
||||||
|
"image64" => $image64,
|
||||||
|
"path" => $path,
|
||||||
|
"fileName" => $fileName,
|
||||||
|
"scale" => $scale
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$data = Base::upload([
|
||||||
|
"file" => Request::file('image'),
|
||||||
|
"type" => 'image',
|
||||||
|
"path" => $path,
|
||||||
|
"fileName" => $fileName,
|
||||||
|
"scale" => $scale
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if (Base::isError($data)) {
|
||||||
|
return Base::retError($data['msg']);
|
||||||
|
} else {
|
||||||
|
return Base::retSuccess('success', $data['data']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/system/get/imgview 11. 浏览图片空间
|
||||||
|
*
|
||||||
|
* @apiDescription 需要token身份
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName imgview
|
||||||
|
*
|
||||||
|
* @apiParam {String} path 路径
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function imgview()
|
||||||
|
{
|
||||||
|
if (User::token2userid() === 0) {
|
||||||
|
return Base::retError('身份失效,等重新登录!');
|
||||||
|
}
|
||||||
|
$publicPath = "uploads/picture/" . User::token2userid() . "/";
|
||||||
|
$dirPath = public_path($publicPath);
|
||||||
|
$dirs = $files = [];
|
||||||
|
//
|
||||||
|
$path = Request::input('path');
|
||||||
|
if ($path && is_string($path)) {
|
||||||
|
$path = str_replace(array('||', '|'), '/', $path);
|
||||||
|
$path = trim($path, '/');
|
||||||
|
$path = str_replace('..', '', $path);
|
||||||
|
$path = Base::leftDelete($path, $publicPath);
|
||||||
|
if ($path) {
|
||||||
|
$path = $path . '/';
|
||||||
|
$dirPath .= $path;
|
||||||
|
//
|
||||||
|
$dirs[] = [
|
||||||
|
'type' => 'dir',
|
||||||
|
'title' => '...',
|
||||||
|
'path' => substr(substr($path, 0, -1), 0, strripos(substr($path, 0, -1), '/')),
|
||||||
|
'url' => '',
|
||||||
|
'thumb' => Base::fillUrl('images/other/dir.png'),
|
||||||
|
'inode' => 0,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$path = '';
|
||||||
|
}
|
||||||
|
$list = glob($dirPath . '*', GLOB_BRACE);
|
||||||
|
foreach ($list as $v) {
|
||||||
|
$filename = basename($v);
|
||||||
|
$pathTemp = $publicPath . $path . $filename;
|
||||||
|
if (is_dir($v)) {
|
||||||
|
$dirs[] = [
|
||||||
|
'type' => 'dir',
|
||||||
|
'title' => $filename,
|
||||||
|
'path' => $pathTemp,
|
||||||
|
'url' => Base::fillUrl($pathTemp),
|
||||||
|
'thumb' => Base::fillUrl('images/other/dir.png'),
|
||||||
|
'inode' => fileatime($v),
|
||||||
|
];
|
||||||
|
} elseif (substr($filename, -10) != "_thumb.jpg") {
|
||||||
|
$array = [
|
||||||
|
'type' => 'file',
|
||||||
|
'title' => $filename,
|
||||||
|
'path' => $pathTemp,
|
||||||
|
'url' => Base::fillUrl($pathTemp),
|
||||||
|
'thumb' => $pathTemp,
|
||||||
|
'inode' => fileatime($v),
|
||||||
|
];
|
||||||
|
//
|
||||||
|
$extension = pathinfo($dirPath . $filename, PATHINFO_EXTENSION);
|
||||||
|
if (in_array($extension, array('gif', 'jpg', 'jpeg', 'png', 'bmp'))) {
|
||||||
|
if (file_exists($dirPath . $filename . '_thumb.jpg')) {
|
||||||
|
$array['thumb'] .= '_thumb.jpg';
|
||||||
|
}
|
||||||
|
$array['thumb'] = Base::fillUrl($array['thumb']);
|
||||||
|
$files[] = $array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($dirs) {
|
||||||
|
$inOrder = [];
|
||||||
|
foreach ($dirs as $key => $item) {
|
||||||
|
$inOrder[$key] = $item['title'];
|
||||||
|
}
|
||||||
|
array_multisort($inOrder, SORT_DESC, $dirs);
|
||||||
|
}
|
||||||
|
if ($files) {
|
||||||
|
$inOrder = [];
|
||||||
|
foreach ($files as $key => $item) {
|
||||||
|
$inOrder[$key] = $item['inode'];
|
||||||
|
}
|
||||||
|
array_multisort($inOrder, SORT_DESC, $files);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return Base::retSuccess('success', ['dirs' => $dirs, 'files' => $files]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} api/system/fileupload 12. 上传文件
|
||||||
|
*
|
||||||
|
* @apiDescription 需要token身份
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup system
|
||||||
|
* @apiName fileupload
|
||||||
|
*
|
||||||
|
* @apiParam {String} [image64] 图片base64
|
||||||
|
* @apiParam {String} filename 文件名
|
||||||
|
* @apiParam {String} [files] 文件名
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function fileupload()
|
||||||
|
{
|
||||||
|
if (User::token2userid() === 0) {
|
||||||
|
return Base::retError('身份失效,等重新登录!');
|
||||||
|
}
|
||||||
|
$path = "uploads/files/" . User::token2userid() . "/" . date("Ym") . "/";
|
||||||
|
$image64 = trim(Base::getPostValue('image64'));
|
||||||
|
$fileName = trim(Base::getPostValue('filename'));
|
||||||
|
if ($image64) {
|
||||||
|
$data = Base::image64save([
|
||||||
|
"image64" => $image64,
|
||||||
|
"path" => $path,
|
||||||
|
"fileName" => $fileName,
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$data = Base::upload([
|
||||||
|
"file" => Request::file('files'),
|
||||||
|
"type" => 'file',
|
||||||
|
"path" => $path,
|
||||||
|
"fileName" => $fileName,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
@ -28,7 +28,7 @@ class UsersController extends AbstractController
|
|||||||
* - login:登录(默认)
|
* - login:登录(默认)
|
||||||
* - reg:注册
|
* - reg:注册
|
||||||
* @apiParam {String} email 邮箱
|
* @apiParam {String} email 邮箱
|
||||||
* @apiParam {String} userpass 密码
|
* @apiParam {String} password 密码
|
||||||
* @apiParam {String} [code] 登录验证码
|
* @apiParam {String} [code] 登录验证码
|
||||||
* @apiParam {String} [key] 登陆验证码key
|
* @apiParam {String} [key] 登陆验证码key
|
||||||
*
|
*
|
||||||
@ -40,13 +40,13 @@ class UsersController extends AbstractController
|
|||||||
{
|
{
|
||||||
$type = trim(Request::input('type'));
|
$type = trim(Request::input('type'));
|
||||||
$email = trim(Request::input('email'));
|
$email = trim(Request::input('email'));
|
||||||
$userpass = trim(Request::input('userpass'));
|
$password = trim(Request::input('password'));
|
||||||
if ($type == 'reg') {
|
if ($type == 'reg') {
|
||||||
$setting = Base::setting('system');
|
$setting = Base::setting('system');
|
||||||
if ($setting['reg'] == 'close') {
|
if ($setting['reg'] == 'close') {
|
||||||
return Base::retError('未开放注册!');
|
return Base::retError('未开放注册!');
|
||||||
}
|
}
|
||||||
$user = User::reg($email, $userpass);
|
$user = User::reg($email, $password);
|
||||||
if (Base::isError($user)) {
|
if (Base::isError($user)) {
|
||||||
return $user;
|
return $user;
|
||||||
} else {
|
} else {
|
||||||
@ -81,7 +81,7 @@ class UsersController extends AbstractController
|
|||||||
if (empty($user)) {
|
if (empty($user)) {
|
||||||
return $retError('账号或密码错误!');
|
return $retError('账号或密码错误!');
|
||||||
}
|
}
|
||||||
if ($user->userpass != Base::md52($userpass, $user->encrypt)) {
|
if ($user->password != Base::md52($password, $user->encrypt)) {
|
||||||
return $retError('账号或密码错误!');
|
return $retError('账号或密码错误!');
|
||||||
}
|
}
|
||||||
Cache::forget("code::" . $email);
|
Cache::forget("code::" . $email);
|
||||||
@ -96,8 +96,7 @@ class UsersController extends AbstractController
|
|||||||
];
|
];
|
||||||
$user->updateInstance($array);
|
$user->updateInstance($array);
|
||||||
$user->save();
|
$user->save();
|
||||||
//
|
User::token($user);
|
||||||
$user->token = User::token($user);
|
|
||||||
return Base::retSuccess($type == 'reg' ? "注册成功" : "登录成功", $user);
|
return Base::retSuccess($type == 'reg' ? "注册成功" : "登录成功", $user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,6 +180,8 @@ class UsersController extends AbstractController
|
|||||||
$user = User::IDE($user['data']);
|
$user = User::IDE($user['data']);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
User::token($user);
|
||||||
|
//
|
||||||
if (strlen($callback) > 3) {
|
if (strlen($callback) > 3) {
|
||||||
return $callback . '(' . json_encode(Base::retSuccess('success', $user)) . ')';
|
return $callback . '(' . json_encode(Base::retSuccess('success', $user)) . ')';
|
||||||
}
|
}
|
||||||
@ -197,6 +198,7 @@ class UsersController extends AbstractController
|
|||||||
*
|
*
|
||||||
* @apiParam {Object} [userimg] 会员头像(地址)
|
* @apiParam {Object} [userimg] 会员头像(地址)
|
||||||
* @apiParam {String} [nickname] 昵称
|
* @apiParam {String} [nickname] 昵称
|
||||||
|
* @apiParam {String} [profession] 职位/职称
|
||||||
*
|
*
|
||||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
@ -222,14 +224,26 @@ class UsersController extends AbstractController
|
|||||||
if ($nickname) {
|
if ($nickname) {
|
||||||
if (mb_strlen($nickname) < 2) {
|
if (mb_strlen($nickname) < 2) {
|
||||||
return Base::retError('昵称不可以少于2个字!');
|
return Base::retError('昵称不可以少于2个字!');
|
||||||
} elseif (mb_strlen($nickname) > 8) {
|
} elseif (mb_strlen($nickname) > 20) {
|
||||||
return Base::retError('昵称最多只能设置8个字!');
|
return Base::retError('昵称最多只能设置20个字!');
|
||||||
} else {
|
} else {
|
||||||
$user->nickname = $nickname;
|
$user->nickname = $nickname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//职位/职称
|
||||||
|
$profession = trim(Request::input('profession'));
|
||||||
|
if ($profession) {
|
||||||
|
if (mb_strlen($profession) < 2) {
|
||||||
|
return Base::retError('职位/职称不可以少于2个字!');
|
||||||
|
} elseif (mb_strlen($profession) > 20) {
|
||||||
|
return Base::retError('职位/职称最多只能设置20个字!');
|
||||||
|
} else {
|
||||||
|
$user->profession = $profession;
|
||||||
|
}
|
||||||
|
}
|
||||||
//
|
//
|
||||||
$user->save();
|
$user->save();
|
||||||
|
User::token($user);
|
||||||
return Base::retSuccess('修改成功!', $user);
|
return Base::retSuccess('修改成功!', $user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,15 +291,16 @@ class UsersController extends AbstractController
|
|||||||
return Base::retError('当前环境禁止修改密码!');
|
return Base::retError('当前环境禁止修改密码!');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$verify = User::whereUserid($user->userid)->whereUserpass(Base::md52($oldpass, User::token2encrypt()))->count();
|
$verify = User::whereUserid($user->userid)->wherePassword(Base::md52($oldpass, User::token2encrypt()))->count();
|
||||||
if (empty($verify)) {
|
if (empty($verify)) {
|
||||||
return Base::retError('请填写正确的旧密码!');
|
return Base::retError('请填写正确的旧密码!');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$user->encrypt = Base::generatePassword(6);
|
$user->encrypt = Base::generatePassword(6);
|
||||||
$user->userpass = Base::md52($newpass, $user->encrypt);
|
$user->password = Base::md52($newpass, $user->encrypt);
|
||||||
$user->changepass = 0;
|
$user->changepass = 0;
|
||||||
$user->save();
|
$user->save();
|
||||||
|
User::token($user);
|
||||||
return Base::retSuccess('修改成功!', $user);
|
return Base::retSuccess('修改成功!', $user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,12 @@ class VerifyCsrfToken extends Middleware
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $except = [
|
protected $except = [
|
||||||
|
//上传图片
|
||||||
|
'api/system/imgupload/',
|
||||||
|
|
||||||
|
//上传文件
|
||||||
|
'api/system/fileupload/',
|
||||||
|
|
||||||
// 添加任务
|
// 添加任务
|
||||||
'api/project/task/add/',
|
'api/project/task/add/',
|
||||||
];
|
];
|
||||||
|
@ -49,6 +49,8 @@ use Carbon\Carbon;
|
|||||||
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUpdatedAt($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUpdatedAt($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUserid($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUserid($value)
|
||||||
* @mixin \Eloquent
|
* @mixin \Eloquent
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskTag[] $taskTag
|
||||||
|
* @property-read int|null $task_tag_count
|
||||||
*/
|
*/
|
||||||
class ProjectTask extends AbstractModel
|
class ProjectTask extends AbstractModel
|
||||||
{
|
{
|
||||||
|
@ -16,9 +16,10 @@ use Carbon\Carbon;
|
|||||||
* @property string|null $az A-Z
|
* @property string|null $az A-Z
|
||||||
* @property string|null $email 邮箱
|
* @property string|null $email 邮箱
|
||||||
* @property string $nickname 昵称
|
* @property string $nickname 昵称
|
||||||
|
* @property string|null $profession 职位/职称
|
||||||
* @property string $userimg 头像
|
* @property string $userimg 头像
|
||||||
* @property string|null $encrypt
|
* @property string|null $encrypt
|
||||||
* @property string|null $userpass 登录密码
|
* @property string|null $password 登录密码
|
||||||
* @property int|null $changepass 登录需要修改密码
|
* @property int|null $changepass 登录需要修改密码
|
||||||
* @property int|null $login_num 累计登录次数
|
* @property int|null $login_num 累计登录次数
|
||||||
* @property string|null $last_ip 最后登录IP
|
* @property string|null $last_ip 最后登录IP
|
||||||
@ -44,10 +45,11 @@ use Carbon\Carbon;
|
|||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereLineIp($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereLineIp($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereLoginNum($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereLoginNum($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereNickname($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereNickname($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereProfession($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserid($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserid($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value)
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|User whereUserpass($value)
|
* @method static \Illuminate\Database\Eloquent\Builder|User wherePassword($value)
|
||||||
* @mixin \Eloquent
|
* @mixin \Eloquent
|
||||||
*/
|
*/
|
||||||
class User extends AbstractModel
|
class User extends AbstractModel
|
||||||
@ -55,8 +57,6 @@ class User extends AbstractModel
|
|||||||
protected $primaryKey = 'userid';
|
protected $primaryKey = 'userid';
|
||||||
|
|
||||||
protected $hidden = [
|
protected $hidden = [
|
||||||
'encrypt',
|
|
||||||
'userpass',
|
|
||||||
'updated_at',
|
'updated_at',
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -119,6 +119,15 @@ class User extends AbstractModel
|
|||||||
return WebSocket::whereUserid($this->userid)->exists();
|
return WebSocket::whereUserid($this->userid)->exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否管理员
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isAdmin()
|
||||||
|
{
|
||||||
|
return in_array('admin', $this->identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** ***************************************************************************************** */
|
/** ***************************************************************************************** */
|
||||||
/** ***************************************************************************************** */
|
/** ***************************************************************************************** */
|
||||||
@ -127,11 +136,11 @@ class User extends AbstractModel
|
|||||||
/**
|
/**
|
||||||
* 注册会员
|
* 注册会员
|
||||||
* @param $email
|
* @param $email
|
||||||
* @param $userpass
|
* @param $password
|
||||||
* @param array $other
|
* @param array $other
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public static function reg($email, $userpass, $other = [])
|
public static function reg($email, $password, $other = [])
|
||||||
{
|
{
|
||||||
//邮箱
|
//邮箱
|
||||||
if (!Base::isMail($email)) {
|
if (!Base::isMail($email)) {
|
||||||
@ -141,9 +150,9 @@ class User extends AbstractModel
|
|||||||
return Base::retError('邮箱地址已存在!');
|
return Base::retError('邮箱地址已存在!');
|
||||||
}
|
}
|
||||||
//密码
|
//密码
|
||||||
if (strlen($userpass) < 6) {
|
if (strlen($password) < 6) {
|
||||||
return Base::retError(['密码设置不能小于%位数!', 6]);
|
return Base::retError(['密码设置不能小于%位数!', 6]);
|
||||||
} elseif (strlen($userpass) > 32) {
|
} elseif (strlen($password) > 32) {
|
||||||
return Base::retError(['密码最多只能设置%位数!', 32]);
|
return Base::retError(['密码最多只能设置%位数!', 32]);
|
||||||
}
|
}
|
||||||
//开始注册
|
//开始注册
|
||||||
@ -151,7 +160,7 @@ class User extends AbstractModel
|
|||||||
$inArray = [
|
$inArray = [
|
||||||
'encrypt' => $encrypt,
|
'encrypt' => $encrypt,
|
||||||
'email' => $email,
|
'email' => $email,
|
||||||
'userpass' => Base::md52($userpass, $encrypt),
|
'password' => Base::md52($password, $encrypt),
|
||||||
'created_ip' => Base::getIp(),
|
'created_ip' => Base::getIp(),
|
||||||
];
|
];
|
||||||
if ($other) {
|
if ($other) {
|
||||||
@ -293,7 +302,10 @@ class User extends AbstractModel
|
|||||||
*/
|
*/
|
||||||
public static function token($userinfo)
|
public static function token($userinfo)
|
||||||
{
|
{
|
||||||
return base64_encode($userinfo->userid . '#$' . $userinfo->email . '#$' . $userinfo->encrypt . '#$' . time() . '#$' . Base::generatePassword(6));
|
$userinfo->token = base64_encode($userinfo->userid . '#$' . $userinfo->email . '#$' . $userinfo->encrypt . '#$' . time() . '#$' . Base::generatePassword(6));
|
||||||
|
unset($userinfo->encrypt);
|
||||||
|
unset($userinfo->password);
|
||||||
|
return $userinfo->token;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -355,7 +367,7 @@ class User extends AbstractModel
|
|||||||
if (isset($_A["__static_userid2basic_" . $userid])) {
|
if (isset($_A["__static_userid2basic_" . $userid])) {
|
||||||
return $_A["__static_userid2basic_" . $userid];
|
return $_A["__static_userid2basic_" . $userid];
|
||||||
}
|
}
|
||||||
$fields = ['userid', 'email', 'nickname', 'userimg'];
|
$fields = ['userid', 'email', 'nickname', 'profession', 'userimg'];
|
||||||
$userInfo = self::whereUserid($userid)->select($fields)->first();
|
$userInfo = self::whereUserid($userid)->select($fields)->first();
|
||||||
if ($userInfo) {
|
if ($userInfo) {
|
||||||
$userInfo->online = $userInfo->getOnlineStatus();
|
$userInfo->online = $userInfo->getOnlineStatus();
|
||||||
@ -383,8 +395,8 @@ class User extends AbstractModel
|
|||||||
*/
|
*/
|
||||||
public static function needCode($email)
|
public static function needCode($email)
|
||||||
{
|
{
|
||||||
$loginCode = Base::settingFind('system', 'loginCode');
|
$login_code = Base::settingFind('system', 'login_code');
|
||||||
switch ($loginCode) {
|
switch ($login_code) {
|
||||||
case 'open':
|
case 'open':
|
||||||
return Base::retSuccess('need');
|
return Base::retSuccess('need');
|
||||||
|
|
||||||
|
@ -1149,6 +1149,7 @@ class Base
|
|||||||
if ($array !== false) {
|
if ($array !== false) {
|
||||||
$setting = $array;
|
$setting = $array;
|
||||||
$row->updateInstance(['setting' => $array]);
|
$row->updateInstance(['setting' => $array]);
|
||||||
|
$row->save();
|
||||||
}
|
}
|
||||||
$_A["__static_setting_" . $setname] = $setting;
|
$_A["__static_setting_" . $setname] = $setting;
|
||||||
return $setting;
|
return $setting;
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<Icon type="md-speedometer" />
|
<Icon type="md-speedometer" />
|
||||||
<div class="menu-title">Dashboard</div>
|
<div class="menu-title">Dashboard</div>
|
||||||
</li>
|
</li>
|
||||||
<li @click="toggleRoute('setting')" :class="classNameRoute('setting')">
|
<li @click="toggleRoute('setting/personal')" :class="classNameRoute('setting')">
|
||||||
<Icon type="md-cog" />
|
<Icon type="md-cog" />
|
||||||
<div class="menu-title">Setting</div>
|
<div class="menu-title">Setting</div>
|
||||||
</li>
|
</li>
|
||||||
@ -293,9 +293,10 @@ export default {
|
|||||||
toggleRoute(path) {
|
toggleRoute(path) {
|
||||||
this.goForward({path: '/manage/' + path});
|
this.goForward({path: '/manage/' + path});
|
||||||
},
|
},
|
||||||
|
|
||||||
classNameRoute(path) {
|
classNameRoute(path) {
|
||||||
return {
|
return {
|
||||||
"active": this.curPath == '/manage/' + path
|
"active": $A.leftExists(this.curPath, '/manage/' + path)
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -652,12 +652,13 @@
|
|||||||
> pre {
|
> pre {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ivu-icon {
|
.ivu-icon {
|
||||||
font-size: 22px;
|
font-size: 22px;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
padding-left: 4px;
|
margin-left: 8px;
|
||||||
}
|
}
|
||||||
&.has-desc {
|
&.has-desc {
|
||||||
.task-title {
|
.task-title {
|
||||||
@ -668,7 +669,7 @@
|
|||||||
.task-desc {
|
.task-desc {
|
||||||
color: #999999;
|
color: #999999;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
line-height: 18px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
.task-tags {
|
.task-tags {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="setting">
|
|
||||||
<PageTitle>{{$L('Setting')}}</PageTitle>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
150
resources/assets/js/pages/manage/setting/index.vue
Normal file
150
resources/assets/js/pages/manage/setting/index.vue
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting">
|
||||||
|
<PageTitle>{{$L('设置')}}</PageTitle>
|
||||||
|
<div class="setting-head">
|
||||||
|
<div class="setting-titbox">
|
||||||
|
<div class="setting-title">
|
||||||
|
<h1>{{$L('设置')}}</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="setting-box">
|
||||||
|
<div class="setting-menu">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(item, key) in menu" :key="key" @click="toggleRoute(item.path)" :class="classNameRoute(item.path)">{{$L(item.name)}}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="setting-content">
|
||||||
|
<div class="setting-content-title">{{$L('密码设置')}}</div>
|
||||||
|
<div class="setting-content-view"><router-view class="setting-router-view"></router-view></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
:global {
|
||||||
|
.setting {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.setting-head {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin: 32px 32px 16px;
|
||||||
|
border-bottom: 1px solid #F4F4F5;
|
||||||
|
.setting-titbox {
|
||||||
|
flex: 1;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
.setting-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
> h1 {
|
||||||
|
color: #333333;
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.setting-box {
|
||||||
|
flex: 1;
|
||||||
|
height: 0;
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
.setting-menu {
|
||||||
|
width: 200px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
border-right: 1px solid #F4F4F5;
|
||||||
|
overflow: auto;
|
||||||
|
> ul {
|
||||||
|
padding: 12px 0 0 32px;
|
||||||
|
> li {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #6C7D8C;
|
||||||
|
list-style: none;
|
||||||
|
line-height: 42px;
|
||||||
|
padding: 0 20px;
|
||||||
|
margin: 5px 0;
|
||||||
|
position: relative;
|
||||||
|
&.active,
|
||||||
|
&:hover {
|
||||||
|
background-color: #F4F5F7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.setting-content {
|
||||||
|
flex: 1;
|
||||||
|
overflow: auto;
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.setting-content-title {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 500;
|
||||||
|
padding: 12px 32px;
|
||||||
|
}
|
||||||
|
.setting-content-view {
|
||||||
|
flex: 1;
|
||||||
|
position: relative;
|
||||||
|
.setting-router-view {
|
||||||
|
padding: 24px 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
curPath: this.$route.path,
|
||||||
|
|
||||||
|
menu: [
|
||||||
|
{
|
||||||
|
path: 'personal',
|
||||||
|
name: '个人设置'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'password',
|
||||||
|
name: '密码设置'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'system',
|
||||||
|
name: '系统设置'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'priority',
|
||||||
|
name: '任务优先级'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['userInfo']),
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'$route' (route) {
|
||||||
|
this.curPath = route.path;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toggleRoute(path) {
|
||||||
|
this.goForward({path: '/manage/setting/' + path});
|
||||||
|
},
|
||||||
|
|
||||||
|
classNameRoute(path) {
|
||||||
|
return {
|
||||||
|
"active": $A.leftExists(this.curPath, '/manage/setting/' + path)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
107
resources/assets/js/pages/manage/setting/password.vue
Normal file
107
resources/assets/js/pages/manage/setting/password.vue
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-item submit">
|
||||||
|
<Form ref="formDatum" :model="formDatum" :rules="ruleDatum" label-width="auto" @submit.native.prevent>
|
||||||
|
<FormItem :label="$L('旧密码')" prop="oldpass">
|
||||||
|
<Input v-model="formDatum.oldpass" type="password"></Input>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('新密码')" prop="newpass">
|
||||||
|
<Input v-model="formDatum.newpass" type="password"></Input>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('确认新密码')" prop="checkpass">
|
||||||
|
<Input v-model="formDatum.checkpass" type="password"></Input>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div class="setting-footer">
|
||||||
|
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
||||||
|
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{$L('重置')}}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loadIng: 0,
|
||||||
|
|
||||||
|
formDatum: {
|
||||||
|
oldpass: '',
|
||||||
|
newpass: '',
|
||||||
|
checkpass: '',
|
||||||
|
},
|
||||||
|
|
||||||
|
ruleDatum: { },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initLanguage() {
|
||||||
|
this.ruleDatum = {
|
||||||
|
oldpass: [
|
||||||
|
{ required: true, message: this.$L('请输入旧密码!'), trigger: 'change' },
|
||||||
|
{ type: 'string', min: 6, message: this.$L('密码长度至少6位!'), trigger: 'change' }
|
||||||
|
],
|
||||||
|
newpass: [
|
||||||
|
{
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
if (value === '') {
|
||||||
|
callback(new Error(this.$L('请输入新密码!')));
|
||||||
|
} else {
|
||||||
|
if (this.formDatum.checkpass !== '') {
|
||||||
|
this.$refs.formDatum.validateField('checkpass');
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
trigger: 'change'
|
||||||
|
},
|
||||||
|
{ type: 'string', min: 6, message: this.$L('密码长度至少6位!'), trigger: 'change' }
|
||||||
|
],
|
||||||
|
checkpass: [
|
||||||
|
{
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
if (value === '') {
|
||||||
|
callback(new Error(this.$L('请重新输入新密码!')));
|
||||||
|
} else if (value !== this.formDatum.newpass) {
|
||||||
|
callback(new Error(this.$L('两次密码输入不一致!')));
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
trigger: 'change'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.formDatum.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.loadIng++;
|
||||||
|
$A.apiAjax({
|
||||||
|
url: 'users/editpass',
|
||||||
|
data: this.formDatum,
|
||||||
|
complete: () => {
|
||||||
|
this.loadIng--;
|
||||||
|
},
|
||||||
|
success: ({ret, data, msg}) => {
|
||||||
|
if (ret === 1) {
|
||||||
|
$A.messageSuccess('修改成功!');
|
||||||
|
this.$store.commit('setUserInfo', data);
|
||||||
|
this.$refs.formDatum.resetFields();
|
||||||
|
} else {
|
||||||
|
$A.modalError(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
resetForm() {
|
||||||
|
this.$refs.formDatum.resetFields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
99
resources/assets/js/pages/manage/setting/personal.vue
Normal file
99
resources/assets/js/pages/manage/setting/personal.vue
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-item submit">
|
||||||
|
<Form ref="formDatum" :model="formDatum" :rules="ruleDatum" label-width="auto" @submit.native.prevent>
|
||||||
|
<FormItem :label="$L('头像')" prop="userimg">
|
||||||
|
<ImgUpload v-model="formDatum.userimg" :num="1"></ImgUpload>
|
||||||
|
<span class="form-tip">{{$L('建议尺寸:%', '200x200')}}</span>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('邮箱')">
|
||||||
|
<Input v-model="userInfo.email" disabled></Input>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('昵称')" prop="nickname">
|
||||||
|
<Input v-model="formDatum.nickname" :maxlength="20"></Input>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('职位/职称')" prop="profession">
|
||||||
|
<Input v-model="formDatum.profession" :maxlength="20"></Input>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div class="setting-footer">
|
||||||
|
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
||||||
|
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{$L('重置')}}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ImgUpload from "../../../components/ImgUpload";
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
export default {
|
||||||
|
components: {ImgUpload},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loadIng: 0,
|
||||||
|
|
||||||
|
formDatum: {
|
||||||
|
userimg: '',
|
||||||
|
nickname: '',
|
||||||
|
profession: ''
|
||||||
|
},
|
||||||
|
|
||||||
|
ruleDatum: { },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.initData();
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState(['userInfo']),
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
userInfo() {
|
||||||
|
this.initData();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initLanguage() {
|
||||||
|
this.ruleDatum = {
|
||||||
|
nickname: [
|
||||||
|
{required: true, message: this.$L('请输入昵称!'), trigger: 'change'},
|
||||||
|
{type: 'string', min: 2, message: this.$L('昵称长度至少2位!'), trigger: 'change'}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
initData() {
|
||||||
|
this.$set(this.formDatum, 'userimg', this.userInfo.userimg);
|
||||||
|
this.$set(this.formDatum, 'nickname', this.userInfo.nickname);
|
||||||
|
this.$set(this.formDatum, 'profession', this.userInfo.profession);
|
||||||
|
this.formDatum_bak = $A.cloneJSON(this.formDatum);
|
||||||
|
},
|
||||||
|
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.formDatum.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.loadIng++;
|
||||||
|
$A.apiAjax({
|
||||||
|
url: 'users/editdata',
|
||||||
|
data: this.formDatum,
|
||||||
|
complete: () => {
|
||||||
|
this.loadIng--;
|
||||||
|
},
|
||||||
|
success: ({ret, data, msg}) => {
|
||||||
|
if (ret === 1) {
|
||||||
|
$A.messageSuccess('修改成功');
|
||||||
|
this.$store.commit('getUserInfo');
|
||||||
|
} else {
|
||||||
|
$A.modalError(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
resetForm() {
|
||||||
|
this.formDatum = $A.cloneJSON(this.formDatum_bak);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
29
resources/assets/js/pages/manage/setting/priority.vue
Normal file
29
resources/assets/js/pages/manage/setting/priority.vue
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-item">
|
||||||
|
asdada
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
:global {
|
||||||
|
.setting-item {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
77
resources/assets/js/pages/manage/setting/system.vue
Normal file
77
resources/assets/js/pages/manage/setting/system.vue
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-item submit">
|
||||||
|
<Form ref="formDatum" :model="formDatum" label-width="auto" @submit.native.prevent>
|
||||||
|
<FormItem :label="$L('允许注册')" prop="reg">
|
||||||
|
<RadioGroup v-model="formDatum.reg">
|
||||||
|
<Radio label="open">{{$L('允许')}}</Radio>
|
||||||
|
<Radio label="close">{{$L('禁止')}}</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem :label="$L('登录验证码')" prop="loginCode">
|
||||||
|
<RadioGroup v-model="formDatum.login_code">
|
||||||
|
<Radio label="auto">{{$L('自动')}}</Radio>
|
||||||
|
<Radio label="open">{{$L('开启')}}</Radio>
|
||||||
|
<Radio label="close">{{$L('关闭')}}</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
<div class="setting-footer">
|
||||||
|
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{$L('提交')}}</Button>
|
||||||
|
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{$L('重置')}}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loadIng: 0,
|
||||||
|
|
||||||
|
formDatum: {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.systemSetting();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.formDatum.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.systemSetting(true);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
resetForm() {
|
||||||
|
this.formDatum = $A.cloneJSON(this.formDatum_bak);
|
||||||
|
},
|
||||||
|
|
||||||
|
systemSetting(save) {
|
||||||
|
this.loadIng++;
|
||||||
|
$A.apiAjax({
|
||||||
|
url: 'system/setting?type=' + (save ? 'save' : 'get'),
|
||||||
|
data: this.formDatum,
|
||||||
|
complete: () => {
|
||||||
|
this.loadIng--;
|
||||||
|
},
|
||||||
|
success: (res) => {
|
||||||
|
if (res.ret === 1) {
|
||||||
|
this.formDatum = res.data;
|
||||||
|
this.formDatum_bak = $A.cloneJSON(this.formDatum);
|
||||||
|
if (save) {
|
||||||
|
$A.messageSuccess('修改成功');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (save) {
|
||||||
|
$A.modalError(res.msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -25,7 +25,33 @@ export default [
|
|||||||
{
|
{
|
||||||
name: 'manage-setting',
|
name: 'manage-setting',
|
||||||
path: 'setting',
|
path: 'setting',
|
||||||
component: () => import('./pages/manage/setting.vue'),
|
component: () => import('./pages/manage/setting/index.vue'),
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
redirect: 'personal',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'manage-setting-personal',
|
||||||
|
path: 'personal',
|
||||||
|
component: () => import('./pages/manage/setting/personal.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'manage-setting-password',
|
||||||
|
path: 'password',
|
||||||
|
component: () => import('./pages/manage/setting/password.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'manage-setting-personal',
|
||||||
|
path: 'system',
|
||||||
|
component: () => import('./pages/manage/setting/system.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'manage-setting-personal',
|
||||||
|
path: 'priority',
|
||||||
|
component: () => import('./pages/manage/setting/priority.vue'),
|
||||||
|
},
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'manage-project-detail',
|
name: 'manage-project-detail',
|
||||||
|
@ -23,20 +23,18 @@ export default {
|
|||||||
* @param callback
|
* @param callback
|
||||||
*/
|
*/
|
||||||
getUserInfo(state, callback) {
|
getUserInfo(state, callback) {
|
||||||
if (typeof callback === 'function' || callback === true) {
|
$A.apiAjax({
|
||||||
$A.apiAjax({
|
url: 'users/info',
|
||||||
url: 'users/info',
|
error: () => {
|
||||||
error: () => {
|
$A.userLogout();
|
||||||
$A.userLogout();
|
},
|
||||||
},
|
success: ({ret, data, msg}) => {
|
||||||
success: ({ret, data, msg}) => {
|
if (ret === 1) {
|
||||||
if (ret === 1) {
|
this.commit('setUserInfo', data);
|
||||||
this.commit('setUserInfo', data);
|
typeof callback === "function" && callback(data);
|
||||||
typeof callback === "function" && callback(data);
|
}
|
||||||
}
|
},
|
||||||
},
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
return state.userInfo;
|
return state.userInfo;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -107,27 +105,45 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const {userid, success, complete} = params;
|
const {userid, success, complete} = params;
|
||||||
if (typeof success === "function") {
|
const time = Math.round(new Date().getTime() / 1000);
|
||||||
if (state._isArray(userid)) {
|
const array = [];
|
||||||
userid.forEach((uid) => {
|
(state._isArray(userid) ? userid : [userid]).some((uid) => {
|
||||||
state.cacheUserBasic[uid] && success(state.cacheUserBasic[uid], false)
|
if (state.cacheUserBasic[uid]) {
|
||||||
});
|
typeof success === "function" && success(state.cacheUserBasic[uid].data, false);
|
||||||
} else {
|
if (time - state.cacheUserBasic[uid].time <= 10) {
|
||||||
state.cacheUserBasic[userid] && success(state.cacheUserBasic[userid], false)
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
array.push(uid);
|
||||||
|
});
|
||||||
|
if (array.length === 0) {
|
||||||
|
typeof complete === "function" && complete()
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
if (state.cacheUserBasic["::loading"] === true) {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.commit('getUserBasic', params);
|
||||||
|
}, 20);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state.cacheUserBasic["::loading"] = true;
|
||||||
$A.apiAjax({
|
$A.apiAjax({
|
||||||
url: 'users/basic',
|
url: 'users/basic',
|
||||||
data: {
|
data: {
|
||||||
userid: userid
|
userid: array
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
|
state.cacheUserBasic["::loading"] = false;
|
||||||
typeof complete === "function" && complete()
|
typeof complete === "function" && complete()
|
||||||
},
|
},
|
||||||
success: ({ret, data, msg}) => {
|
success: ({ret, data, msg}) => {
|
||||||
if (ret === 1) {
|
if (ret === 1) {
|
||||||
data.forEach((item) => {
|
data.forEach((item) => {
|
||||||
state.cacheUserBasic[item.userid] = item;
|
state.cacheUserBasic[item.userid] = {
|
||||||
|
time,
|
||||||
|
data: item
|
||||||
|
};
|
||||||
typeof success === "function" && success(item, true)
|
typeof success === "function" && success(item, true)
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -15,6 +15,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
.ivu-input,
|
||||||
|
.ivu-select-selection {
|
||||||
|
border-color: #e8e8e8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.ivu-modal-wrap {
|
.ivu-modal-wrap {
|
||||||
&.simple-modal {
|
&.simple-modal {
|
||||||
.ivu-modal {
|
.ivu-modal {
|
||||||
@ -328,10 +335,6 @@
|
|||||||
.ivu-form-item-label {
|
.ivu-form-item-label {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
.ivu-input,
|
|
||||||
.ivu-select-selection {
|
|
||||||
border-color: #e8e8e8;
|
|
||||||
}
|
|
||||||
.teditor-box {
|
.teditor-box {
|
||||||
.tox-tinymce {
|
.tox-tinymce {
|
||||||
border-color: #e8e8e8;
|
border-color: #e8e8e8;
|
||||||
@ -580,5 +583,36 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.setting-item {
|
||||||
|
.ivu-input,
|
||||||
|
.ivu-select-selection {
|
||||||
|
max-width: 460px;
|
||||||
|
}
|
||||||
|
.form-tip {
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
.setting-footer {
|
||||||
|
> button {
|
||||||
|
height: 34px;
|
||||||
|
line-height: 32px;
|
||||||
|
padding: 0 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.submit {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
.setting-footer {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 1;
|
||||||
|
padding: 16px 24px 0;
|
||||||
|
border-top: 1px solid #F4F4F5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Http\Controllers\Api\ProjectController;
|
use App\Http\Controllers\Api\ProjectController;
|
||||||
|
use App\Http\Controllers\Api\SystemController;
|
||||||
use App\Http\Controllers\Api\UsersController;
|
use App\Http\Controllers\Api\UsersController;
|
||||||
use App\Http\Controllers\IndexController;
|
use App\Http\Controllers\IndexController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
@ -24,9 +25,12 @@ Route::prefix('api')->middleware(['webapi'])->group(function () {
|
|||||||
// 会员
|
// 会员
|
||||||
Route::any('users/{method}', UsersController::class);
|
Route::any('users/{method}', UsersController::class);
|
||||||
Route::any('users/{method}/{action}', UsersController::class);
|
Route::any('users/{method}/{action}', UsersController::class);
|
||||||
//项目
|
// 项目
|
||||||
Route::any('project/{method}', ProjectController::class);
|
Route::any('project/{method}', ProjectController::class);
|
||||||
Route::any('project/{method}/{action}', ProjectController::class);
|
Route::any('project/{method}/{action}', ProjectController::class);
|
||||||
|
// 系统
|
||||||
|
Route::any('system/{method}', SystemController::class);
|
||||||
|
Route::any('system/{method}/{action}', SystemController::class);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user