first commit
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemTool\Services\SysFileService;
|
||||
use Modules\SystemUser\Http\Requests\SysUserUpdateRequest;
|
||||
use Modules\SystemUser\Models\SysLoginRecordModel;
|
||||
use Modules\SystemUser\Models\SysRuleModel;
|
||||
use Modules\SystemUser\Models\SysUserModel;
|
||||
|
||||
#[RequestAttribute('/system')]
|
||||
class IndexController extends BaseController
|
||||
{
|
||||
|
||||
/** 用户登录 */
|
||||
#[PostRoute('/login', false, 'login_log')]
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'username' => 'required|min:3|alphaDash',
|
||||
'password' => 'required|min:4|alphaDash',
|
||||
]);
|
||||
|
||||
if (Auth::guard('sys_users')->attempt($credentials)) {
|
||||
$userID = auth()->id();
|
||||
$user = SysUserModel::find($userID);
|
||||
$access = $user->access();
|
||||
if($request->input('remember', false)) {
|
||||
$expiration = null;
|
||||
} else {
|
||||
$expiration = now()->addDays(3);
|
||||
}
|
||||
$data = $request->user()
|
||||
->createToken($credentials['username'], $access, $expiration)
|
||||
->toArray();
|
||||
if(empty($data['plainTextToken'])) {
|
||||
return $this->error(__('user.login_error'));
|
||||
}
|
||||
$response = [
|
||||
'token' => $data['plainTextToken']
|
||||
];
|
||||
|
||||
SysUserModel::query()->where('id', $userID)->update([
|
||||
'login_time' => now(),
|
||||
'login_ip' => $request->ip(),
|
||||
]);
|
||||
return $this->success($response, __('user.login_success'));
|
||||
}
|
||||
return $this->error(__('user.login_error'));
|
||||
}
|
||||
|
||||
/** 退出登录 */
|
||||
#[PostRoute('/logout')]
|
||||
public function logout(Request $request): JsonResponse
|
||||
{
|
||||
$request->user()->currentAccessToken()->delete();
|
||||
return $this->success(__('user.logout_success'));
|
||||
}
|
||||
|
||||
/** 获取管理员信息 */
|
||||
#[GetRoute('/info')]
|
||||
public function info(): JsonResponse
|
||||
{
|
||||
$info = Auth::user();
|
||||
$access = $info->access();
|
||||
return $this->success(compact('access','info'));
|
||||
}
|
||||
|
||||
/** 获取菜单信息 */
|
||||
#[GetRoute('/menu')]
|
||||
public function menu(): JsonResponse
|
||||
{
|
||||
$id = Auth::id();
|
||||
if($id == 1) {
|
||||
$menus = SysRuleModel::query()
|
||||
->where('status', 1)
|
||||
->whereIn('type', ['menu','route'])
|
||||
->get()
|
||||
->toArray();
|
||||
} else {
|
||||
$roles = SysUserModel::with(['roles.rules' => function ($query) {
|
||||
$query->where('status', 1)->whereIn('type', ['menu','route']);
|
||||
}])->find($id)->roles->toArray();
|
||||
|
||||
$menus = collect($roles)
|
||||
->map(fn ($item) => $item['rules'])
|
||||
->collapse()
|
||||
->map(fn ($item) => collect($item)->forget(['pivot', 'updated_at', 'created_at', 'status']) )
|
||||
->unique('id')
|
||||
->toArray();
|
||||
}
|
||||
$menus = getTreeData($menus);
|
||||
return $this->success(compact('menus'));
|
||||
}
|
||||
|
||||
/** 更新管理员信息 */
|
||||
#[PutRoute('/updateInfo')]
|
||||
public function updateInfo(SysUserUpdateRequest $request): JsonResponse
|
||||
{
|
||||
$data = $request->validated();
|
||||
$id = auth()->id();
|
||||
$model = SysUserModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error(__('user.user_not_exist'));
|
||||
}
|
||||
return $this->success($model->update($data));
|
||||
}
|
||||
|
||||
/** 修改密码 */
|
||||
#[PutRoute('/updatePassword')]
|
||||
public function updatePassword(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'oldPassword' => 'required|string|min:6|max:20',
|
||||
'newPassword' => 'required|string|min:6|max:20',
|
||||
'rePassword' => 'required|same:newPassword',
|
||||
]);
|
||||
$user_id = auth()->id();
|
||||
$user = SysUserModel::find($user_id);
|
||||
if (! password_verify($validated['oldPassword'], $user->password)) {
|
||||
return $this->error(__('user.old_password_error'));
|
||||
}
|
||||
$user->password = Hash::make($validated['newPassword']);
|
||||
$user->save();
|
||||
return $this->success('ok');
|
||||
}
|
||||
|
||||
/** 上传头像 */
|
||||
#[PostRoute('/uploadAvatar')]
|
||||
public function uploadAvatar(Request $request): JsonResponse
|
||||
{
|
||||
$user_id = Auth::id();
|
||||
$file = $request->file('file');
|
||||
$service = new SysFileService();
|
||||
$data = $service->upload($file, 2, 20, $user_id);
|
||||
$user = SysUserModel::find($user_id);
|
||||
$user->avatar_id = $data['id'];
|
||||
$user->save();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 获取管理员登录日志 */
|
||||
#[GetRoute('/loginRecord')]
|
||||
public function loginRecord(): JsonResponse
|
||||
{
|
||||
$id = Auth::id();
|
||||
$data = SysLoginRecordModel::where('user_id', $id)
|
||||
->limit(10)
|
||||
->orderBy('id', 'desc')
|
||||
->get()
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemUser\Http\Requests\SysDeptFormRequest;
|
||||
use Modules\SystemUser\Models\SysDeptModel;
|
||||
|
||||
/**
|
||||
* 部门管理控制器
|
||||
*/
|
||||
#[RequestAttribute('/system/dept', 'system.dept')]
|
||||
class SysDeptController extends BaseController
|
||||
{
|
||||
|
||||
/** 部门列表 */
|
||||
#[GetRoute(authorize: 'query')]
|
||||
public function query(): JsonResponse
|
||||
{
|
||||
$data = SysDeptModel::orderBy('sort', 'desc')->get()->toArray();
|
||||
$data = getTreeData($data);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 创建部门 */
|
||||
#[PostRoute(authorize: 'create')]
|
||||
public function create(SysDeptFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysDeptModel::create($validated);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 编辑部门 */
|
||||
#[PutRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'update',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function update(int $id, SysDeptFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysDeptModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
$model->update($validated);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 删除部门 */
|
||||
#[DeleteRoute(authorize: 'delete')]
|
||||
public function delete(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer|exists:sys_dept,id'
|
||||
]);
|
||||
|
||||
$ids = $request->input('ids');
|
||||
|
||||
$departmentsWithChildren = SysDeptModel::whereIn('id', $ids)
|
||||
->whereHas('children')
|
||||
->get();
|
||||
|
||||
if ($departmentsWithChildren->isNotEmpty()) {
|
||||
return $this->error('存在下级部门的部门无法删除');
|
||||
}
|
||||
|
||||
SysDeptModel::whereIn('id', $ids)->delete();
|
||||
return $this->success('部门删除成功');
|
||||
}
|
||||
|
||||
/** 获取部门用户列表 */
|
||||
#[GetRoute('/users/{id}', 'users')]
|
||||
public function users(int $id): JsonResponse
|
||||
{
|
||||
$model = SysDeptModel::query()->find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error('部门不存在');
|
||||
}
|
||||
$pageSize = request()->input('pageSize') ?? 10;
|
||||
$data = $model->users()
|
||||
->select(['id', 'username', 'nickname', 'email', 'mobile', 'status'])
|
||||
->paginate($pageSize)
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Controllers;
|
||||
|
||||
use App\Exceptions\RepositoryException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemUser\Http\Requests\SysRoleFormRequest;
|
||||
use Modules\SystemUser\Models\SysRoleModel;
|
||||
use Modules\SystemUser\Models\SysRuleModel;
|
||||
|
||||
/**
|
||||
* 角色管理控制器
|
||||
*/
|
||||
#[RequestAttribute('/system/role', 'system.role')]
|
||||
class SysRoleController extends BaseController
|
||||
{
|
||||
protected array $quickSearchField = ['name', 'description'];
|
||||
protected array $searchField = [
|
||||
'status' => '=',
|
||||
'name' => 'like',
|
||||
];
|
||||
|
||||
/** 查询角色列表 */
|
||||
#[GetRoute(authorize: 'query')]
|
||||
public function query(Request $request): JsonResponse
|
||||
{
|
||||
$params = $request->all();
|
||||
$pageSize = $params['pageSize'] ?? 10;
|
||||
$query = SysRoleModel::query();
|
||||
$data = $this->buildSearch($params, $query)
|
||||
->paginate($pageSize)
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 创建角色 */
|
||||
#[PostRoute(authorize: 'create')]
|
||||
public function create(SysRoleFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysRoleModel::create($validated);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 编辑角色 */
|
||||
#[PutRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'update',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function update(int $id, SysRoleFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysRoleModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
$model->update($validated);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 删除角色 */
|
||||
#[DeleteRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'delete',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function delete(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRoleModel::find($id);
|
||||
if (empty($model)) {
|
||||
throw new RepositoryException('角色不存在');
|
||||
}
|
||||
if ($model->countUser > 0) {
|
||||
throw new RepositoryException('该角色下存在用户,无法删除');
|
||||
}
|
||||
$model->delete();
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 获取角色用户列表 */
|
||||
#[GetRoute('/users/{id}', 'users')]
|
||||
public function users(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRoleModel::query()->find($id);
|
||||
if (empty($model)) {
|
||||
throw new RepositoryException('角色不存在');
|
||||
}
|
||||
$pageSize = request()->input('pageSize', 10);
|
||||
$data = $model->users()
|
||||
->paginate($pageSize, ['id', 'username', 'nickname', 'email', 'mobile', 'status'])
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 设置启用状态 */
|
||||
#[PutRoute('/status/{id}', 'status')]
|
||||
public function status(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRoleModel::find($id);
|
||||
if (!$model) {
|
||||
return $this->error(__('system.data_not_exist'));
|
||||
}
|
||||
$model->status = $model->status ? 0 : 1;
|
||||
$model->save();
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 获取权限选项 */
|
||||
#[GetRoute('/ruleList', 'ruleList')]
|
||||
public function ruleList(): JsonResponse
|
||||
{
|
||||
$data = SysRuleModel::query()
|
||||
->where("status", 1)
|
||||
->get(['name as title', 'parent_id', 'id as key', 'id', 'local'])
|
||||
->toArray();
|
||||
$data = getTreeData($data);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 设置角色权限 */
|
||||
#[PostRoute('/setRule', 'setRule')]
|
||||
public function setRule(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'role_id' => 'required|exists:sys_role,id',
|
||||
'rule_ids' => 'required|array|exists:sys_rule,id',
|
||||
]);
|
||||
if ($validated['role_id'] == 1) {
|
||||
throw new RepositoryException('超级管理员不能修改权限');
|
||||
}
|
||||
$model = SysRoleModel::findOrFail($validated['role_id']);
|
||||
$model->rules()->sync($validated['rule_ids']);
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemUser\Http\Requests\SysRuleFormRequest;
|
||||
use Modules\SystemUser\Models\SysRuleModel;
|
||||
|
||||
/**
|
||||
* 管理员权限控制器
|
||||
*/
|
||||
#[RequestAttribute('/system/rule', 'system.rule')]
|
||||
class SysRuleController extends BaseController
|
||||
{
|
||||
protected array $quickSearchField = ['name', 'key', 'path'];
|
||||
protected array $searchField = [
|
||||
'type' => '=',
|
||||
'status' => '=',
|
||||
'show' => '=',
|
||||
'parent_id' => '=',
|
||||
];
|
||||
|
||||
/** 获取权限列表(树形) */
|
||||
#[GetRoute(authorize: 'query')]
|
||||
public function query(): JsonResponse
|
||||
{
|
||||
$rules = SysRuleModel::all();
|
||||
$data = $rules->toArray();
|
||||
$data = getTreeData($data);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 创建权限 */
|
||||
#[PostRoute(authorize: 'create')]
|
||||
public function create(SysRuleFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysRuleModel::create($validated);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 编辑权限 */
|
||||
#[PutRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'update',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function update(int $id, SysRuleFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysRuleModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
$model->update($validated);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 删除权限 */
|
||||
#[DeleteRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'delete',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function delete(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRuleModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
$model->delete();
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 获取父级权限 */
|
||||
#[GetRoute('/parent', authorize: 'parentQuery')]
|
||||
public function getRulesParent(): JsonResponse
|
||||
{
|
||||
$data = SysRuleModel::query()
|
||||
->whereIn('type', ['menu', 'route'])
|
||||
->get(['name', 'id', 'parent_id'])
|
||||
->toArray();
|
||||
$data = getTreeData($data);
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 设置显示状态 */
|
||||
#[PutRoute('/show/{id}', authorize: 'show')]
|
||||
public function show(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRuleModel::find($id);
|
||||
if (!$model) {
|
||||
return $this->error(__('system.data_not_exist'));
|
||||
}
|
||||
$model->hidden = $model->hidden ? 0 : 1;
|
||||
$model->save();
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 设置启用状态 */
|
||||
#[PutRoute('/status/{id}', authorize: 'status')]
|
||||
public function status(int $id): JsonResponse
|
||||
{
|
||||
$model = SysRuleModel::find($id);
|
||||
if (!$model) {
|
||||
return $this->error(__('system.data_not_exist'));
|
||||
}
|
||||
$model->status = $model->status ? 0 : 1;
|
||||
$model->save();
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemUser\Http\Requests\SysUserFormRequest;
|
||||
use Modules\SystemUser\Models\SysDeptModel;
|
||||
use Modules\SystemUser\Models\SysRoleModel;
|
||||
use Modules\SystemUser\Models\SysUserModel;
|
||||
|
||||
/**
|
||||
* 管理员用户控制器
|
||||
*/
|
||||
#[RequestAttribute('/system/user', 'system.user')]
|
||||
class SysUserController extends BaseController
|
||||
{
|
||||
|
||||
/** 查询管理员用户列表 */
|
||||
#[GetRoute(authorize: 'query')]
|
||||
public function query(Request $request): JsonResponse
|
||||
{
|
||||
$params = $request->all();
|
||||
$pageSize = $params['pageSize'] ?? 10;
|
||||
$query = SysUserModel::query();
|
||||
$data = $this->buildSearch($params, $query)
|
||||
->paginate($pageSize)
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 创建管理员用户 */
|
||||
#[PostRoute(authorize: 'create')]
|
||||
public function create(SysUserFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$user = SysUserModel::create([
|
||||
'username' => $validated['username'],
|
||||
'nickname' => $validated['nickname'],
|
||||
'email' => $validated['email'],
|
||||
'mobile' => $validated['mobile'],
|
||||
'password' => Hash::make($validated['password']),
|
||||
'status' => $validated['status'] ?? 1,
|
||||
'dept_id' => $validated['dept_id'] ?? null,
|
||||
'sex' => $validated['sex'] ?? 0
|
||||
]);
|
||||
if(empty($user)) {
|
||||
return $this->error();
|
||||
}
|
||||
$user->roles()->sync($validated['role_id'] ?? []);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 编辑管理员用户 */
|
||||
#[PutRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'update',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function update(int $id, SysUserFormRequest $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validated();
|
||||
$model = SysUserModel::find($id);
|
||||
if (empty($model)) {
|
||||
return $this->error();
|
||||
}
|
||||
$model->roles()->sync($validated['role_id'] ?? []);
|
||||
$model->update($validated);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 删除管理员用户 */
|
||||
#[DeleteRoute(
|
||||
route: '/{id}',
|
||||
authorize: 'delete',
|
||||
where: ['id' => '[0-9]+']
|
||||
)]
|
||||
public function delete(int $id): JsonResponse
|
||||
{
|
||||
if($id == 1) {
|
||||
$this->error('不能删除系统用户!');
|
||||
}
|
||||
$user = SysUserModel::find($id);
|
||||
if (empty($user)) {
|
||||
$this->error('Model not found');
|
||||
}
|
||||
$user->roles()->detach();
|
||||
$user->delete();
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/** 重置用户密码 */
|
||||
#[PutRoute('/resetPassword', 'resetPassword')]
|
||||
public function resetPassword(Request $request): JsonResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'id' => 'required|exists:sys_user,id',
|
||||
'password' => 'required|string|min:6|max:20',
|
||||
'rePassword' => 'required|same:password',
|
||||
], [
|
||||
'id.required' => '请选择管理员用户!',
|
||||
'id.exists' => '管理员用户不存在!',
|
||||
'password.required' => '请输入管理员密码!',
|
||||
'password.min' => '密码最短为6个字符!',
|
||||
'password.max' => '密码最长伟20个字符!',
|
||||
'rePassword.required' => '请重复输入密码!',
|
||||
'rePassword.same' => '两次输入的密码不同!',
|
||||
]);
|
||||
$user = SysUserModel::find($data['id']);
|
||||
if (!$user) {
|
||||
return $this->error(__('user.user_not_exist'));
|
||||
}
|
||||
$user->password = Hash::make($data['password']);
|
||||
$user->save();
|
||||
return $this->success('ok');
|
||||
}
|
||||
|
||||
/** 获取用户角色选项栏数据 */
|
||||
#[GetRoute('/role', 'role')]
|
||||
public function role(): JsonResponse
|
||||
{
|
||||
$data = SysRoleModel::where('status', 1)
|
||||
->get(['id as role_id', 'name'])
|
||||
->toArray();
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/** 获取用户部门选项栏数据 */
|
||||
#[GetRoute('/dept', 'dept')]
|
||||
public function dept(): JsonResponse
|
||||
{
|
||||
$field = SysDeptModel::where('status', 0)
|
||||
->select(['id as dept_id', 'name', 'parent_id'])
|
||||
->get()
|
||||
->toArray();
|
||||
$data = $this->buildTree($field);
|
||||
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
private function buildTree(array $items, $parentId = 0): array
|
||||
{
|
||||
$tree = [];
|
||||
foreach ($items as $item) {
|
||||
if ($item['parent_id'] == $parentId) {
|
||||
$children = $this->buildTree($items, $item['dept_id']);
|
||||
$node = [
|
||||
'dept_id' => $item['dept_id'],
|
||||
'name' => $item['name'],
|
||||
'children' => $children
|
||||
];
|
||||
$tree[] = $node;
|
||||
}
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\SystemUser\Models\SysAccessToken;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class AuthGuardMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Closure(Request): (Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next, ...$guards): Response
|
||||
{
|
||||
$token = $request->bearerToken();
|
||||
if (!$token) {
|
||||
return response()->json(['msg' => 'Token not provided', 'success' => false], 401);
|
||||
}
|
||||
// 查找 token
|
||||
$accessToken = SysAccessToken::findToken($token);
|
||||
if (!$accessToken) {
|
||||
return response()->json(['msg' => 'Invalid token', 'success' => false], 401);
|
||||
}
|
||||
if (empty($guards)) {
|
||||
$guards = ['sys_users'];
|
||||
}
|
||||
Log::info('Guards: ', $guards);
|
||||
Log::info('Auth Providers: ', config('auth.providers'));
|
||||
foreach ($guards as $guard) {
|
||||
Log::info('Auth Providers Model: ' . config('auth.providers.' . $guard . '.model'));
|
||||
if ($accessToken->tokenable_type == config('auth.providers.' . $guard . '.model')) {
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
return response()->json([
|
||||
'msg' => __('user.not_login'),
|
||||
'success' => false
|
||||
], 401);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Modules\SystemUser\Models\SysLoginRecordModel;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class LoginLogMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Closure(Request): (Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
try {
|
||||
// 获取用户名(假设用户名通过请求体传递)
|
||||
$userAgent = $request->userAgent();
|
||||
// 继续处理请求
|
||||
$response = $next($request);
|
||||
$user_id = auth()->id();
|
||||
$username = auth()->user()['username'];
|
||||
// 获取响应状态和消息
|
||||
$content = json_decode($response->getContent(), true); // 响应内容
|
||||
$message = $content['msg'] ?? 'No message'; // 从响应中提取消息
|
||||
SysLoginRecordModel::create([
|
||||
'ipaddr' => $request->ip(),
|
||||
'browser' => $this->getBrowser($userAgent),
|
||||
'os' => $this->getOs($userAgent),
|
||||
'username' => $username,
|
||||
'user_id' => $user_id,
|
||||
'login_location' => $this->getLocation($request->ip()),
|
||||
'status' => $content['success'] ? '0' : '1',
|
||||
'msg' => $message,
|
||||
'login_time' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
}catch (\Exception $e) {
|
||||
// 记录错误日志
|
||||
Log::error('Failed to log user login info: ' . $e->getMessage());
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取浏览器信息
|
||||
* @param string $userAgent
|
||||
* @return string
|
||||
*/
|
||||
private function getBrowser(string $userAgent): string
|
||||
{
|
||||
$browser = 'XXX';
|
||||
// 简单的解析逻辑(可以根据需要扩展)
|
||||
if (str_contains($userAgent, 'Firefox')) {
|
||||
$browser = 'Firefox';
|
||||
} elseif (str_contains($userAgent, 'Chrome')) {
|
||||
$browser = 'Chrome';
|
||||
} elseif (str_contains($userAgent, 'Safari')) {
|
||||
$browser = 'Safari';
|
||||
} elseif (str_contains($userAgent, 'MSIE') || str_contains($userAgent, 'Trident')) {
|
||||
$browser = 'Internet Explorer';
|
||||
}
|
||||
return $browser;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取操作系统信息
|
||||
* @param string $userAgent
|
||||
* @return string
|
||||
*/
|
||||
private function getOs(string $userAgent): string
|
||||
{
|
||||
$os = 'Unknown';
|
||||
if (str_contains($userAgent, 'Windows')) {
|
||||
$os = 'Windows';
|
||||
} elseif (str_contains($userAgent, 'Macintosh')) {
|
||||
$os = 'Mac OS';
|
||||
} elseif (str_contains($userAgent, 'Linux')) {
|
||||
$os = 'Linux';
|
||||
} elseif (str_contains($userAgent, 'Android')) {
|
||||
$os = 'Android';
|
||||
} elseif (str_contains($userAgent, 'iOS')) {
|
||||
$os = 'iOS';
|
||||
}
|
||||
return $os;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 IP 地址对应的地理位置
|
||||
*
|
||||
* @param string $ip
|
||||
* @return string
|
||||
*/
|
||||
private function getLocation(string $ip): string
|
||||
{
|
||||
if($ip == '127.0.0.1') {
|
||||
return '本地';
|
||||
}
|
||||
// 这里可以使用第三方 API(如 IPStack 或 IPInfo)来获取地理位置
|
||||
try {
|
||||
$response = file_get_contents("https://ipinfo.io/{$ip}/json");
|
||||
$data = json_decode($response, true);
|
||||
return $data['city'] . ', ' . $data['country'];
|
||||
}catch (\Exception $e) {
|
||||
return 'XXX';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Requests;
|
||||
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Modules\Common\Http\Requests\BaseFormRequest;
|
||||
|
||||
class SysDeptFormRequest extends BaseFormRequest
|
||||
{
|
||||
protected $stopOnFirstFailure = true;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
if (!$this->isUpdate()) {
|
||||
return [
|
||||
'name' => 'required|unique:sys_dept,name',
|
||||
'code' => 'required|unique:sys_dept,code',
|
||||
'type' => 'required|integer|in:0,1,2',
|
||||
'parent_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
function ($attribute, $value, $fail) {
|
||||
if ($value != 0 && !DB::table('sys_dept')->where('id', $value)->exists()) {
|
||||
$fail('选择的上级部门不存在。');
|
||||
}
|
||||
},
|
||||
],
|
||||
'sort' => 'required|integer',
|
||||
'phone' => 'nullable',
|
||||
'address' => 'nullable',
|
||||
'email' => 'nullable|email',
|
||||
'status' => 'required|in:0,1',
|
||||
'remark' => 'nullable',
|
||||
];
|
||||
} else {
|
||||
$id = $this->route('id');
|
||||
return [
|
||||
'name' => [
|
||||
'required',
|
||||
Rule::unique('sys_dept', 'name')->ignore($id)
|
||||
],
|
||||
'code' => [
|
||||
'required',
|
||||
Rule::unique('sys_dept', 'code')->ignore($id)
|
||||
],
|
||||
'type' => 'required|integer|in:0,1,2',
|
||||
'sort' => 'required|integer',
|
||||
'phone' => 'nullable',
|
||||
'address' => 'nullable',
|
||||
'email' => 'nullable|email',
|
||||
'status' => 'required|in:0,1',
|
||||
'remark' => 'nullable',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'name.required' => '部门名称不能为空',
|
||||
'name.unique' => '部门名称已存在',
|
||||
'code.required' => '部门编码不能为空',
|
||||
'code.unique' => '部门编码已存在',
|
||||
'type.required' => '部门类型不能为空',
|
||||
'type.integer' => '部门类型必须是整数',
|
||||
'type.in' => '部门类型错误',
|
||||
'parent_id.required' => '上级部门不能为空',
|
||||
'parent_id.integer' => '上级部门ID必须是整数',
|
||||
'parent_id.exists' => '选择的上级部门不存在',
|
||||
'sort.required' => '排序字段不能为空',
|
||||
'sort.integer' => '排序字段必须是整数',
|
||||
'email.email' => '请输入有效的邮箱地址',
|
||||
'status.required' => '状态不能为空',
|
||||
'status.in' => '状态类型错误',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Requests;
|
||||
|
||||
use Illuminate\Validation\Rule;
|
||||
use Modules\Common\Http\Requests\BaseFormRequest;
|
||||
|
||||
class SysRoleFormRequest extends BaseFormRequest
|
||||
{
|
||||
protected $stopOnFirstFailure = true;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
if (!$this->isUpdate()) {
|
||||
return [
|
||||
'name' => 'required|unique:sys_role,name',
|
||||
'sort' => 'required|integer|min:0',
|
||||
'description' => 'nullable|string',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
];
|
||||
} else {
|
||||
$id = $this->route('id');
|
||||
return [
|
||||
'name' => [
|
||||
'required',
|
||||
'string',
|
||||
Rule::unique('sys_role', 'name')->ignore($id),
|
||||
],
|
||||
'sort' => 'required|integer|min:0',
|
||||
'description' => 'nullable|string',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'name.required' => '角色名称不能为空',
|
||||
'name.unique' => '角色名称已存在',
|
||||
'sort.required' => '排序不能为空',
|
||||
'sort.integer' => '排序必须为整数',
|
||||
'status.required' => '状态不能为空',
|
||||
'status.in' => '状态格式错误',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Requests;
|
||||
|
||||
use App\Exceptions\RepositoryException;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Modules\Common\Http\Requests\BaseFormRequest;
|
||||
|
||||
class SysRuleFormRequest extends BaseFormRequest
|
||||
{
|
||||
protected $stopOnFirstFailure = true;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
$type = $this->input('type');
|
||||
if (empty($type)) {
|
||||
throw new RepositoryException('权限类型为必填项!');
|
||||
}
|
||||
if (!in_array($type, ['menu', 'route', 'rule'])) {
|
||||
throw new RepositoryException('权限类型错误!');
|
||||
}
|
||||
|
||||
$rules = [
|
||||
'parent_id' => [
|
||||
'required',
|
||||
'integer',
|
||||
'numeric',
|
||||
function ($attribute, $value, $fail) {
|
||||
if ($value != 0 && !DB::table('sys_rule')->where('id', $value)->exists()) {
|
||||
$fail('选择的上级权限不存在。');
|
||||
}
|
||||
},
|
||||
],
|
||||
'order' => 'required|integer',
|
||||
'name' => 'required',
|
||||
];
|
||||
|
||||
if (!$this->isUpdate()) {
|
||||
$rules['key'] = 'required|unique:sys_rule,key';
|
||||
} else {
|
||||
$rules['key'] = [
|
||||
'required',
|
||||
Rule::unique('sys_rule', 'key')->ignore($this->route('id')),
|
||||
];
|
||||
}
|
||||
|
||||
if ($type == 'menu') {
|
||||
$rules += [
|
||||
'type' => 'required|string|in:menu',
|
||||
'local' => 'nullable|string',
|
||||
'icon' => 'nullable|string',
|
||||
];
|
||||
} elseif ($type == 'route') {
|
||||
$rules += [
|
||||
'type' => 'required|string|in:route',
|
||||
'path' => 'required|string',
|
||||
'local' => 'nullable|string',
|
||||
'icon' => 'nullable|string',
|
||||
'link' => 'required|integer|numeric|in:0,1',
|
||||
];
|
||||
} else {
|
||||
$rules += [
|
||||
'type' => 'required|string|in:rule',
|
||||
];
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'name.required' => '权限名称不能为空',
|
||||
'type.required' => '类型不能为空',
|
||||
'type.in' => '类型格式错误',
|
||||
'order.required' => '排序不能为空',
|
||||
'order.integer' => '排序必须为整数',
|
||||
'key.required' => '唯一标识不能为空',
|
||||
'key.unique' => '唯一标识已存在',
|
||||
'path.required' => '路径不能为空',
|
||||
'parent_id.required' => '父级权限不能为空',
|
||||
'parent_id.integer' => '父级权限格式错误',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Requests;
|
||||
|
||||
use Illuminate\Validation\Rule;
|
||||
use Modules\Common\Http\Requests\BaseFormRequest;
|
||||
|
||||
class SysUserFormRequest extends BaseFormRequest
|
||||
{
|
||||
protected $stopOnFirstFailure = true;
|
||||
|
||||
public function rules(): array
|
||||
{
|
||||
if(!$this->isUpdate()) {
|
||||
return [
|
||||
'username' => 'required|unique:sys_user,username',
|
||||
'nickname' => 'required',
|
||||
'sex' => 'in:0,1',
|
||||
'mobile' => 'required',
|
||||
'email' => 'required|email|unique:sys_user,email',
|
||||
'dept_id' => 'required|exists:sys_dept,id',
|
||||
'role_id' => 'required|array|exists:sys_role,id',
|
||||
'status' => 'required|int|in:1,0',
|
||||
'password' => 'required|min:6',
|
||||
'rePassword' => 'required|same:password',
|
||||
];
|
||||
} else {
|
||||
$id = $this->route('id');
|
||||
return [
|
||||
'username' => [
|
||||
'required',
|
||||
Rule::unique('sys_user', 'username')->ignore($id)
|
||||
],
|
||||
'nickname' => 'required',
|
||||
'sex' => 'in:0,1',
|
||||
'mobile' => 'required',
|
||||
'email' => [
|
||||
'required',
|
||||
Rule::unique('sys_user', 'email')->ignore($id)
|
||||
],
|
||||
'role_id' => 'required|array|exists:sys_role,id',
|
||||
'dept_id' => 'required|exists:sys_dept,id',
|
||||
'status' => 'required|int|in:1,0',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'username.required' => '用户名不能为空',
|
||||
'username.unique' => '用户名已存在',
|
||||
'nickname.required' => '昵称不能为空',
|
||||
'sex.in' => '性别格式错误',
|
||||
'mobile.required' => '手机号不能为空',
|
||||
'email.required' => '邮箱不能为空',
|
||||
'email.email' => '邮箱格式错误',
|
||||
'email.unique' => '邮箱已存在',
|
||||
'dept_id.exists' => '部门不存在',
|
||||
'role_id.exists' => '角色不存在',
|
||||
'status.required' => '状态不能为空',
|
||||
'status.int' => '状态值错误',
|
||||
'status.in' => '状态格式错误',
|
||||
'password.required' => '密码不能为空',
|
||||
'password.min' => '密码至少6位',
|
||||
'rePassword.required' => '确认密码不能为空',
|
||||
'rePassword.same' => '两次密码不一致',
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class SysUserUpdateRequest extends FormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'nickname' => [
|
||||
'required',
|
||||
Rule::unique('sys_user', 'username')->ignore($id)
|
||||
],
|
||||
'sex' => 'required|in:0,1',
|
||||
'bio' => 'sometimes|max:255',
|
||||
'mobile' => [
|
||||
'required',
|
||||
Rule::unique('sys_user', 'mobile')->ignore($id)
|
||||
],
|
||||
'email' => [
|
||||
'required',
|
||||
Rule::unique('sys_user', 'email')->ignore($id)
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'nickname.required' => '昵称不能为空',
|
||||
'sex.required' => '性别不能为空',
|
||||
'sex.in' => '性别格式错误',
|
||||
'bio.max' => '个人简介最大不能超过255个字符',
|
||||
'mobile.required' => '手机号不能为空',
|
||||
'email.required' => '邮箱不能为空',
|
||||
'email.email' => '邮箱格式错误'
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;
|
||||
|
||||
class SysAccessToken extends SanctumPersonalAccessToken
|
||||
{
|
||||
protected $table = 'sys_access_token';
|
||||
|
||||
public function can($ability): bool
|
||||
{
|
||||
if (
|
||||
$this->tokenable_type == SysUserModel::class
|
||||
&& $this->tokenable_id == 1
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
return in_array('*', $this->abilities) ||
|
||||
array_key_exists($ability, array_flip($this->abilities));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
/**
|
||||
* 系统用户部门模型
|
||||
*/
|
||||
class SysDeptModel extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
protected $table = 'sys_dept';
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
protected $fillable = [
|
||||
'parent_id',
|
||||
'name',
|
||||
'code',
|
||||
'type',
|
||||
'sort',
|
||||
'phone',
|
||||
'email',
|
||||
'status',
|
||||
'address',
|
||||
'remark'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'parent_id' => 'integer',
|
||||
'sort' => 'integer',
|
||||
'status' => 'integer',
|
||||
];
|
||||
|
||||
protected $hidden = [ 'deleted_at' ];
|
||||
|
||||
/**
|
||||
* 定义与用户的关联关系(一个部门有多个用户)
|
||||
*/
|
||||
public function users(): HasMany
|
||||
{
|
||||
return $this->hasMany(SysUserModel::class, 'dept_id', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义父级部门关联
|
||||
*/
|
||||
public function parent(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(SysDeptModel::class, 'parent_id', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义子部门关联
|
||||
*/
|
||||
public function children(): HasMany
|
||||
{
|
||||
return $this->hasMany(SysDeptModel::class, 'parent_id', 'id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
/**
|
||||
* 系统用户登录日志模型
|
||||
*/
|
||||
class SysLoginRecordModel extends Model
|
||||
{
|
||||
protected $table = 'sys_login_record';
|
||||
protected $primaryKey = 'id';
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
'username',
|
||||
'ipaddr',
|
||||
'login_location',
|
||||
'browser',
|
||||
'os',
|
||||
'status',
|
||||
'msg',
|
||||
'login_time'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'user_id' => 'integer',
|
||||
'login_time' => 'datetime'
|
||||
];
|
||||
|
||||
/**
|
||||
* 定义与用户的关联关系
|
||||
*/
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(SysUserModel::class, 'user_id', 'id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
|
||||
/**
|
||||
* 系统角色模型
|
||||
*/
|
||||
class SysRoleModel extends Model
|
||||
{
|
||||
protected $table = 'sys_role';
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'sort',
|
||||
'rules',
|
||||
'description',
|
||||
'status'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'sort' => 'integer',
|
||||
'status' => 'integer'
|
||||
];
|
||||
|
||||
protected $appends = ['countUser', 'ruleIds'];
|
||||
|
||||
/**
|
||||
* 角色用户关联
|
||||
*/
|
||||
public function users(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(SysUserModel::class, 'sys_user_role', 'role_id', 'user_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色权限关联中间表
|
||||
*/
|
||||
public function rules(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(SysRuleModel::class, 'sys_role_rule', 'role_id', 'rule_id');
|
||||
}
|
||||
|
||||
/** 用户总数 */
|
||||
public function getCountUserAttribute(): int
|
||||
{
|
||||
return $this->users()->count();
|
||||
}
|
||||
|
||||
/** 拥有的权限ID */
|
||||
public function getRuleIdsAttribute(): array
|
||||
{
|
||||
if(!empty($this->id) && $this->id == 1) {
|
||||
return SysRuleModel::query()->pluck('id')->toArray();
|
||||
}
|
||||
return $this->rules()->pluck('id')->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
/**
|
||||
* 系统规则模型
|
||||
*/
|
||||
class SysRuleModel extends Model
|
||||
{
|
||||
protected $table = 'sys_rule';
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
protected $fillable = [
|
||||
'parent_id',
|
||||
'type',
|
||||
'order',
|
||||
'name',
|
||||
'key',
|
||||
'path',
|
||||
'icon',
|
||||
'local',
|
||||
'link',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'parent_id' => 'integer',
|
||||
'sort' => 'integer',
|
||||
'status' => 'integer',
|
||||
'show' => 'integer'
|
||||
];
|
||||
|
||||
/**
|
||||
* 定义子权限关联
|
||||
*/
|
||||
public function children(): HasMany
|
||||
{
|
||||
return $this->hasMany(SysRuleModel::class, 'parent_id', 'id')
|
||||
->orderBy('sort');
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义父权限关联
|
||||
*/
|
||||
public function parent(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(SysRuleModel::class, 'parent_id', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色权限关联中间表
|
||||
*/
|
||||
public function roles(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(SysRoleModel::class, 'sys_role_rule', 'rule_id', 'role_id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Foundation\Auth\User;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Laravel\Ai\Concerns\HasConversations;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
use Modules\SystemTool\Models\SysFileModel;
|
||||
|
||||
/**
|
||||
* 系统用户模型
|
||||
*/
|
||||
class SysUserModel extends User
|
||||
{
|
||||
use SoftDeletes, HasConversations, HasApiTokens, HasFactory, Notifiable;
|
||||
|
||||
protected $table = 'sys_user';
|
||||
protected $primaryKey = 'id';
|
||||
protected $fillable = [
|
||||
'username',
|
||||
'password',
|
||||
'nickname',
|
||||
'avatar_id',
|
||||
'bio',
|
||||
'sex',
|
||||
'mobile',
|
||||
'email',
|
||||
'email_verified_at',
|
||||
'dept_id',
|
||||
'login_ip',
|
||||
'login_time',
|
||||
'status'
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'email_verified_at' => 'datetime',
|
||||
'login_time' => 'datetime',
|
||||
'status' => 'integer',
|
||||
'sex' => 'integer',
|
||||
'avatar_id' => 'integer',
|
||||
'dept_id' => 'integer'
|
||||
];
|
||||
|
||||
protected $appends = ['role_id', 'dept_name', 'avatar_url'];
|
||||
|
||||
protected $with = ['dept', 'avatar'];
|
||||
|
||||
protected $hidden = [
|
||||
'dept',
|
||||
'avatar',
|
||||
'password',
|
||||
'remember_token',
|
||||
'deleted_at',
|
||||
];
|
||||
|
||||
/**
|
||||
* 定义与部门的归属关系
|
||||
*/
|
||||
public function dept(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(SysDeptModel::class, 'dept_id', 'id');
|
||||
}
|
||||
|
||||
/** 部门名称 */
|
||||
public function getDeptNameAttribute(): string
|
||||
{
|
||||
return $this->dept->name ?? '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义与角色的关联
|
||||
*/
|
||||
public function roles(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(SysRoleModel::class, 'sys_user_role', 'user_id', 'role_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户角色列表
|
||||
*/
|
||||
public function getRoleIdAttribute()
|
||||
{
|
||||
return $this->roles()
|
||||
->pluck('id')->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义与登录日志的关联
|
||||
*/
|
||||
public function loginRecords(): HasMany
|
||||
{
|
||||
return $this->hasMany(SysLoginRecordModel::class, 'user_id', 'id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 关联用户头像
|
||||
* @return HasOne
|
||||
*/
|
||||
public function avatar(): HasOne
|
||||
{
|
||||
return $this->hasOne(SysFileModel::class, 'id', 'avatar_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户角色列表
|
||||
*/
|
||||
public function getAvatarUrlAttribute()
|
||||
{
|
||||
if($this->avatar) {
|
||||
return $this->avatar->preview_url;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户所有权限
|
||||
* @return array
|
||||
*/
|
||||
public function access(): array
|
||||
{
|
||||
if($this->id == 1) {
|
||||
return SysRuleModel::query()
|
||||
->where('status', 1)
|
||||
->pluck('key')
|
||||
->toArray();
|
||||
}
|
||||
$roles = SysUserModel::with(['roles.rules' => function ($query) {
|
||||
$query->where('status', 1);
|
||||
}])->find($this->id)->roles->toArray();
|
||||
|
||||
return collect($roles)
|
||||
->map(fn ($item) => $item['rules'] )
|
||||
->collapse()
|
||||
->map(fn ($item) => $item['key'] )
|
||||
->unique()
|
||||
->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\SystemUser\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Laravel\Sanctum\Sanctum;
|
||||
use Modules\AnnoRoute\AnnoRoute;
|
||||
use Modules\SystemUser\Models\SysAccessToken;
|
||||
|
||||
class SystemUserServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* Register any application services.
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
//...
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*/
|
||||
public function boot(AnnoRoute $annoRoute): void
|
||||
{
|
||||
// 注册路由
|
||||
$annoRoute->register(base_path('modules/SystemUser/Http/Controllers'));
|
||||
|
||||
//
|
||||
Sanctum::usePersonalAccessTokenModel(SysAccessToken::class);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user