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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\Manager;
use App\Manager;
use App\Models\Notifications;
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);
}
/**
* @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="管理老师通过用户名密码登录"
* )
* )
*/
public function loginByUsername()
{
$credentials = request(['username', 'password']);
if (!$token = $this->guard()->attempt($credentials)) {
return response()->json([
'errorcode' => '401',
'errormsg' => '登录失败'
], 401);
}
return $this->respondWithToken($token);
}
/**
* @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="获取登录者信息"
* )
* )
*/
public function me()
{
$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());
}
/**
* @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) {
if (in_array($k, $fillable)) {
$update[$k] = $v;
}
}
$manager->update($update);
return response()->json($manager->toArray());
}
/**
* @OA\Post(
* path="/manager/logout",
* summary="V2 退出登录",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
* description="退出登录"
* )
* )
*/
public function logout()
{
DB::beginTransaction();
try {
$this->guard()->logout();
DB::commit();
return response()->json([
'errormsg' => "退出登录成功!"
]);
} catch (\Exception $exception) {
DB::rollBack();
return response()->json([
'errorcode' => '402',
'errormsg' => $exception->getMessage()
]);
}
}
/**
* @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"
* )
* )
*/
/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
$token = JWTAuth::getToken();
dd($token);
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;
$user = $user->toArray();
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => $this->guard()->factory()->getTTL() * 60,
'user_info' => $user
]);
}
/**
* @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());
}
}