You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
8.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\CreateAdminInput;
use App\Http\Requests\UpdateAdminNickname;
use App\Http\Requests\UpdateAdminPassword;
use App\Models\Admin;
use App\Models\AdminAccount;
use App\Models\AdminAuth;
use App\Models\AdminToken;
use App\Models\Auth;
use Illuminate\Support\Str;
use Yo;
use Login;
class AdminController extends Controller
{
public function delete()
{
Login::admin([6]);
$ids = request()->post('ids');
$super_admin_count = Admin::whereIn('id', $ids)->where('admin_auth_id', -1)->where('del', 2)->count();
if ($super_admin_count > 0) Yo::error_echo(100018);
Admin::whereIn('id', $ids)->update([
'del' => 1
]);
AdminAccount::whereIn('admin_id', $ids)->where('del', 2)->update([
'del' => 1
]);
return Yo::delete_echo($ids);
}
public function update(UpdateAdminNickname $request)
{
Login::admin([6]);
$hospital = $request->post('hospital');
$admin_id = $request->post('admin_id');
$nickname = $request->post('nickname');
$status = $request->post('status');
$admin_auth_id = $request->post('admin_auth_id');
$admin = Admin::find($admin_id);
if (!$admin) Yo::error_echo(100000, ['管理员']);
if ($admin->admin_auth_id != -1 && $admin_auth_id == -1) Yo::error_echo(100018);
if ($admin->admin_auth_id == -1 && $admin_auth_id != -1) Yo::error_echo(100018);
if ($admin->admin_auth_id == -1 && $status == 2) Yo::error_echo(100018);
$admin->hospital = $hospital;
$admin->nickname = $nickname;
$admin->admin_auth_id = $admin_auth_id;
$admin->status = $status;
$admin->save();
return Yo::update_echo($admin->id);
}
public function create(CreateAdminInput $request)
{
Login::admin([6]);
$hospital = $request->post('hospital');
$nickname = $request->post('nickname');
$account = $request->post('account');
$password = $request->post('password');
$admin_auth_id = request()->post('admin_auth_id');
if ($admin_auth_id == -1) Yo::error_echo(100018);
$admin_account_check = AdminAccount::select('id')
->where('account', $account)
->where('type', 1)
->where('del', 2)
->first();
if ($admin_account_check) Yo::error_echo(100017);
$admin = new Admin();
$admin->hospital = $hospital;
$admin->nickname = $nickname;
$admin->admin_auth_id = $admin_auth_id;
$admin->save();
$admin_account = new AdminAccount();
$admin_account->admin_id = $admin->id;
$admin_account->account = $account;
$admin_account->secret = bcrypt($password);
$admin_account->type = 1;
$admin_account->save();
return Yo::create_echo($admin->id);
}
public function list()
{
Login::admin([6]);
$status = request()->post('status');
$search = request()->post('search');
$admin_list = Admin::select('*')
->selectRaw("IFNULL((select name from admin_auths where admins.admin_auth_id = admin_auths.id),'') as admin_auth_name")
->selectRaw("IFNULL((select account from admin_accounts where admins.id = admin_accounts.admin_id and del = 2),'') as account")
->selectRaw("IFNULL((select id from admin_accounts where admins.id = admin_accounts.admin_id and del = 2),'') as account_id")
->where(function ($query) use ($status) {
if ($status != 0) $query->where('status', $status);
})
->where(function ($query) use ($search) {
if ($search != '') $query->where('nickname', 'like', "%$search%");
})
->where('del', 2)
->paginate(15);
return Yo::echo($admin_list);
}
public function edit_password(UpdateAdminPassword $request)
{
Login::admin([6]);
$account_id = request()->post('account_id');
$password = $request->post('password');
$admin_account = AdminAccount::where('id', $account_id)->first();
if (!$admin_account) Yo::error_echo(100002);
$admin_account->secret = bcrypt($password);
$admin_account->save();
return Yo::update_echo(Login::$info->id);
}
public function change_password(UpdateAdminPassword $request)
{
Login::admin();
$account_id = request()->post('account_id');
$password = $request->post('password');
$old_password = request()->post('old_password');
$admin_account = AdminAccount::where('id', $account_id)->where('admin_id', Login::$info->id)->first();
if (!$admin_account) Yo::error_echo(100002);
if (!password_verify($old_password, $admin_account->secret)) Yo::error_echo(100010);
if ($old_password === $password) Yo::error_echo(100009);
$admin_account->secret = bcrypt($password);
$admin_account->save();
return Yo::update_echo(Login::$info->id);
}
public function change_nickname(UpdateAdminNickname $request)
{
Login::admin();
$nickname = $request->post('nickname');
Admin::where('id', Login::$info->id)->update([
'nickname' => $nickname
]);
return Yo::update_echo(Login::$info->id);
}
public function menu()
{
Login::admin();
$menu_group = Auth::select('id', 'name', 'title', 'icon', 'status')
->where('type', 1)->where('show', 1)->where('del', 2)
->orderBy('order', 'desc')->get();
$list = [];
foreach ($menu_group as $item) {
switch (Login::$info->admin_auth_id) {
case -1:
$auth_list = Auth::select('id', 'name', 'title', 'icon', 'status')->where('pid', $item->id)
->where('type', 2)->where('show', 1)->where('del', 2)
->orderBy('order', 'desc')->get();
break;
case 0:
$auth_list = Auth::select('id', 'name', 'title', 'icon', 'status')->where('pid', $item->id)
->where('type', 2)->where('check_type', 1)->where('show', 1)->where('del', 2)
->orderBy('order', 'desc')->get();
break;
default:
$admin_auth = AdminAuth::find(Login::$info->admin_auth_id);
$auth_ids = json_decode($admin_auth->auth_ids, true);
$auth_list = Auth::select('id', 'name', 'title', 'icon', 'status')
->where(function ($query) use ($auth_ids, $item) {
$query->whereIn('id', $auth_ids)->where('pid', $item->id)->where('type', 2)->where('check_type', 2)->where('show', 1)->where('del', 2);
})
->orWhere(function ($query) use ($auth_ids, $item) {
$query->where('type', 2)->where('pid', $item->id)->where('check_type', 1)->where('show', 1)->where('del', 2);
})
->orderBy('order', 'desc')->get();
}
if (count($auth_list) !== 0) $list[] = [
"id" => $item->id,
"name" => $item->name,
"title" => $item->title,
"icon" => $item->icon,
"status" => $item->status,
"children" => $auth_list
];
}
return Yo::echo([
'list' => $list
]);
}
public function info()
{
Login::admin();
$admin_account = AdminAccount::where('admin_id', Login::$info->id)
->where('type', 1)
->where('del', 2)
->first();
return Yo::echo([
'info' => [
'id' => Login::$info->id,
'account' => $admin_account ? $admin_account->account : '',
'account_id' => $admin_account ? $admin_account->id : 0,
'nickname' => Login::$info->nickname,
]
]);
}
public function status()
{
Login::admin();
return Yo::echo();
}
public function create_token($admin, $type): string
{
if ($admin->status != 1 || $admin->del != 2) Yo::error_echo(100002);
$token = Str::orderedUuid();
$admin_token = new AdminToken();
$admin_token->admin_id = $admin->id;
$admin_token->token = $token;
$admin_token->type = $type;
$admin_token->del = 2;
$admin_token->save();
return $token;
}
public function login()
{
$account = request()->post('account');
$password = request()->post('password');
$type = 1;
$admin_account = AdminAccount::where('account', $account)
->where('type', 1)
->where('del', 2)
->first();
if (!$admin_account) Yo::error_echo(100004);
if (!password_verify($password, $admin_account->secret)) Yo::error_echo(100004);
$admin = Admin::where('id', $admin_account->admin_id)
->where('status', 1)
->where('del', 2)
->first();
if (!$admin) Yo::error_echo(100002);
Login::$info = $admin;
Login::$login_type = $type;
$auth_check_res = Login::check_admin_auth([2]);
if ($auth_check_res !== 0) Yo::error_echo($auth_check_res);
$token = $this->create_token($admin, $type);
return Yo::echo([
'token' => $token
]);
}
}