Files
yuezi-saas/backend/app/Http/Controllers/Admin/AuthController.php
T
li ee2b1757d0 feat: 员工自助注册+审核流程
- 新增 registration_packages 表:管理员配置注册套餐(名称/角色)
- AuthController 新增 register() 和 registrationPackages() 公开接口
- UserController 新增 approve() / reject() 审核接口
- StoreController 新增 publicList() 公开门店列表
- 前端 /register 注册页:选门店→选岗位套餐→填信息→提交
- 前端 system/registration-packages:套餐 CRUD
- 用户管理页:待审核状态展示 + 通过/拒绝快捷操作
- 登录页底部加「申请注册」跳转链接
- 路由白名单加 /register
2026-03-14 17:39:50 +08:00

147 lines
4.5 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
/**
* 登录
*/
public function login(Request $request): JsonResponse
{
$request->validate([
'username' => 'required|string',
'password' => 'required|string',
]);
$user = User::withoutGlobalScope('store')
->where('username', $request->username)
->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return $this->error('用户名或密码错误', 40100, 401);
}
if ($user->status->value !== 1) {
return $this->error('账号已被禁用或待审核', 40101, 403);
}
// 清除旧 token
$user->tokens()->delete();
$token = $user->createToken('admin')->plainTextToken;
$user->update(['last_login_at' => now()]);
return $this->success([
'token' => $token,
'user' => [
'id' => $user->id,
'username' => $user->username,
'name' => $user->name,
'avatar' => $user->avatar,
'store_id' => $user->store_id,
'is_super' => $user->is_super,
],
]);
}
/**
* 退出登录
*/
public function logout(Request $request): JsonResponse
{
$request->user()->currentAccessToken()->delete();
return $this->success(null, '退出成功');
}
/**
* 获取当前用户信息
*/
public function me(Request $request): JsonResponse
{
$user = $request->user();
$user->load(['department', 'position', 'roles']);
return $this->success([
'id' => $user->id,
'username' => $user->username,
'name' => $user->name,
'phone' => $user->phone,
'email' => $user->email,
'avatar' => $user->avatar,
'store_id' => $user->store_id,
'is_super' => $user->is_super,
'department' => $user->department?->name,
'position' => $user->position?->name,
'roles' => $user->roles->pluck('name'),
'permissions' => $user->getAllPermissionCodes(),
'menus' => $user->getMenuTree(),
]);
}
/**
* 获取可用注册套餐列表(公开接口)
*/
public function registrationPackages(Request $request): JsonResponse
{
$storeId = $request->input('store_id');
if (!$storeId) {
return $this->error('请选择门店', 42200);
}
$packages = \App\Models\System\RegistrationPackage::withoutGlobalScope('store')
->where('store_id', $storeId)
->where('status', 1)
->orderBy('sort')
->get(['id', 'name', 'description']);
return $this->success($packages);
}
/**
* 自助注册(公开接口)
* 注册后 status=2(待审核),需管理员审批后才能登录
*/
public function register(Request $request): JsonResponse
{
$data = $request->validate([
'store_id' => 'required|exists:stores,id',
'registration_package_id' => 'required|exists:registration_packages,id',
'username' => 'required|string|max:50|unique:users,username',
'password' => 'required|string|min:6',
'name' => 'required|string|max:50',
'phone' => 'required|string|max:20',
]);
// 验证套餐属于该门店
$package = \App\Models\System\RegistrationPackage::withoutGlobalScope('store')
->where('id', $data['registration_package_id'])
->where('store_id', $data['store_id'])
->where('status', 1)
->firstOrFail();
$user = \App\Models\User::create([
'store_id' => $data['store_id'],
'username' => $data['username'],
'password' => $data['password'],
'name' => $data['name'],
'phone' => $data['phone'],
'status' => 2, // Pending
]);
// 绑定套餐角色
if (!empty($package->role_ids)) {
$user->roles()->sync($package->role_ids);
}
return $this->success(null, '注册成功,请等待管理员审核后登录');
}
}