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

360 lines
12 KiB

5 years ago
<?php
namespace App\Http\Controllers\Manager;
use App\Manager;
5 years ago
use App\Models\Notifications;
5 years ago
use App\Models\Recharge;
use App\Notifications\RechargePaid;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Notification;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller
{
public $guardName = "manager";
public $appid;
public $appsecret;
public $authModel;
public function __construct()
{
$this->appid = env("MANAGER_APPID");
$this->appsecret = env("MANAGER_APPSECRET");
$this->authModel = new Manager();
}
/**
* Create a new AuthController instance.
*
* @return void
*/
public function guard()
{
return auth()->guard($this->guardName);
}
public function guardName()
{
return $this->guardName;
}
/**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
/**
* @OA\Post(
* path="/manager/login",
* summary="通过code或用户名和密码登录",
* description="使用code换取openid进行登录如果用户不存在则换username、password登录",
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=true, description="CODE"),
* @OA\Parameter(name="username", in="query", @OA\Schema(type="string"), required=false, description="用户名"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), required=false, description="密码"),
* @OA\Response(
* response="200",
* description="管理老师登录接口"
* )
* )
*/
public function login()
{
$code = request()->code;
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
$url = sprintf($url, $this->appid, $this->appsecret, $code);
$res = curl($url);
if (!isset($res["openid"])) {
return response()->json($res, 401);
}
$openid = $res["openid"];
//换用户名密码登录
$credentials = request(['username', 'password']);
if (!$token = $this->guard()->attempt($credentials)) {
return response()->json([
'errorcode' => '401',
'errormsg' => '登录失败'
], 401);
}
$user = $this->guard()->user();
$user->update([
"openid" => $openid
]);
return $this->respondWithToken($token);
}
/**
* @OA\Post(
* path="/manager/login-by-code",
* summary="通过微信端获取的code进行登录",
* description="",
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=true, description="code"),
* @OA\Response(
* response="200",
* description="管理老师微信code登录接口"
* )
* )
*/
public function loginByCode()
{
$code = request()->code;
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
$url = sprintf($url, $this->appid, $this->appsecret, $code);
$res = curl($url);
if (!isset($res["openid"])) {
return response()->json($res, 401);
}
$openid = $res["openid"];
$user = $this->authModel->where("openid", $openid)->first();
if (!$user) {
return response()->json([
'errorcode' => '401',
'errormsg' => '登录失败'
], 401);
}
$token = $this->guard()->login($user);
return $this->respondWithToken($token);
}
5 years ago
/**
* @OA\Post(
* path="/manager/login-by-username",
* summary="V2-通过用户名密码登录",
* description="",
* @OA\Parameter(name="username", in="query", @OA\Schema(type="string"), required=true, description="用户名"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), required=true, description="密码"),
* @OA\Response(
* response="200",
* description="管理老师通过用户名密码登录"
* )
* )
*/
5 years ago
public function loginByUsername()
{
$credentials = request(['username', 'password']);
if (!$token = $this->guard()->attempt($credentials)) {
return response()->json([
'errorcode' => '401',
'errormsg' => '登录失败'
], 401);
}
return $this->respondWithToken($token);
}
/**
5 years ago
* @OA\Post(
* path="/manager/me",
* summary="V2-获取登录者信息",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
* description="获取登录者信息"
* )
* )
5 years ago
*/
public function me()
{
5 years ago
$id = $this->guard()->id();
$manager = (new Manager())->with(["projects" => function ($query) {
$query->select("project.id", "project.name", "project.address", "project.latitude", "project.longitude");
}])->select("id", "name", "username", "openid", "type", "sex", "mobile", "avatar")->find($id);
return response()->json($manager->toArray());
5 years ago
}
5 years ago
/**
* @OA\Post(
* path="/manager/update",
* summary="V2-登录者个人信息修改",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), required=false, description="姓名"),
* @OA\Parameter(name="sex", in="query", @OA\Schema(type="string"), required=false, description="性别:[男,女]"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), required=false, description="密码"),
* @OA\Parameter(name="openid", in="query", @OA\Schema(type="string"), required=false, description="微信openid"),
* @OA\Parameter(name="unionid", in="query", @OA\Schema(type="string"), required=false, description="微信unionid"),
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="手机号码"),
* @OA\Parameter(name="birthday", in="query", @OA\Schema(type="string"), required=false, description="生日"),
* @OA\Parameter(name="avatar", in="query", @OA\Schema(type="string"), required=false, description="头像访问路径(相对于根目录的绝对路径)"),
* description="",
* @OA\Response(
* response="200",
* description="登录者个人信息修改"
* )
* )
*/
public function update()
{
$manager = $this->guard()->user();
$fillable = (new Manager())->getFillable();
$update = [];
foreach (request()->all() as $k => $v) {
5 years ago
if (in_array($k, $fillable)) {
5 years ago
$update[$k] = $v;
}
}
$manager->update($update);
return response()->json($manager->toArray());
}
5 years ago
/**
* @OA\Post(
* path="/manager/logout",
5 years ago
* summary="V2 退出登录",
5 years ago
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
5 years ago
* description="退出登录"
5 years ago
* )
* )
*/
public function logout()
{
DB::beginTransaction();
try {
$this->guard()->logout();
DB::commit();
return response()->json([
5 years ago
'errormsg' => "退出登录成功!"
5 years ago
]);
} catch (\Exception $exception) {
DB::rollBack();
return response()->json([
'errorcode' => '402',
'errormsg' => $exception->getMessage()
]);
}
}
5 years ago
/**
* @OA\Post(
* path="/manager/refresh",
* summary="V2-刷新token",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
* description="刷新token"
* )
* )
*/
5 years ago
/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
5 years ago
5 years ago
public function refresh()
{
5 years ago
$token = JWTAuth::getToken();
dd($token);
5 years ago
return $this->respondWithToken($this->guard()->refresh());
}
/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
$user = $this->guard()->user();
$user = (new Manager())->with("projects")->find($user->id);
$user->password = null;
5 years ago
$user = $user->toArray();
5 years ago
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => $this->guard()->factory()->getTTL() * 60,
'user_info' => $user
]);
}
5 years ago
/**
* @OA\Get(
* path="/manager/get-notifications",
* summary="V2-获取通知列表",
* description="获取通知列表",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="integer"), required=false, description="当前页码默认为1"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="integer"), required=false, description="每页数量默认为10"),
* @OA\Parameter(name="order_by", in="query", @OA\Schema(type="integer"), required=false, description="排序方法[created_at|desc/created_at|asc]默认为created_at|desc"),
* @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="已读状态[read/unread]默认为空即全部内容read表示已读unread表示未读"),
* @OA\Response(
* response="200",
* description="获取通知列表"
* )
* )
*/
public function getNotifications()
{
$page_size = request()->page_size ? (int)request()->page_size : 10;
if (in_array(request()->order_by, ["created_at|desc", "created_at|asc"])) {
$order_by = explode("|", request()->order_by);
} else {
$order_by = ["created_at", "desc"];
}
$notifications = new Notifications();
switch (request()->status) {
case "read":
$notifications = $notifications->whereNotNull("read_at");
break;
case "unread":
$notifications = $notifications->whereNull("read_at");
break;
}
$notifications = $notifications->where("notifiable_type", Manager::class)
->where("notifiable_id", $this->guard()->id())
->select("id", "type", "notifiable_type", "notifiable_id", "data", "read_at", "created_at")
->orderBy($order_by[0], $order_by[1])
->paginate($page_size);
return response()->json($notifications->toArray());
}
/**
* @OA\Get(
* path="/manager/get-notification/{id}",
* summary="V2-获取通知内容",
* description="获取通知内容",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="获取通知内容"
* )
* )
*/
public function getNotification($id)
{
$notification = (new Notifications())->where("id", $id)->select("id", "type", "notifiable_type", "notifiable_id", "data", "read_at", "created_at")->first();
if (!$notification) {
return response()->json([
'errorcode' => '801',
'errormsg' => "获取通知内容失败"
]);
}
$notification->update([
"read_at" => date("Y-m-d H:i:s")
]);
return response()->json($notification->toArray());
}
5 years ago
}