diff --git a/modules/Permissions/views/roles/form/create.vue b/modules/Permissions/views/roles/form/create.vue
index cbd9c35..88b18d2 100644
--- a/modules/Permissions/views/roles/form/create.vue
+++ b/modules/Permissions/views/roles/form/create.vue
@@ -31,6 +31,19 @@
+
+
+
+
@@ -82,11 +95,22 @@ if (props.primary) {
const emit = defineEmits(['close'])
const roles = ref()
+const permissions = ref()
onMounted(() => {
http.get(props.api).then(r => {
roles.value = r.data.data
})
close(() => emit('close'))
+
+ http.get('permissions/permissions').then(r => {
+ permissions.value = r.data.data
+ })
})
+
+
diff --git a/modules/User/Http/Controllers/UserController.php b/modules/User/Http/Controllers/UserController.php
index 9d678e7..0ee8054 100644
--- a/modules/User/Http/Controllers/UserController.php
+++ b/modules/User/Http/Controllers/UserController.php
@@ -6,12 +6,12 @@ use Catch\Base\CatchController as Controller;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Modules\User\Models\LogLogin;
-use Modules\User\Models\Users;
+use Modules\User\Models\User;
class UserController extends Controller
{
public function __construct(
- protected readonly Users $user
+ protected readonly User $user
) {
}
@@ -44,7 +44,18 @@ class UserController extends Controller
*/
public function show($id)
{
- return $this->user->firstBy($id)->makeHidden('password');
+ return $this->user->setAfterFirstBy(function (User $user){
+ $relations = array_keys($user->getRelations());
+ if (in_array('roles', $relations)) {
+ $user->setRelations([
+ 'roles' => $user->roles->pluck('id'),
+
+ 'jobs' => $user->jobs->pluck('id')
+ ]);
+ }
+
+ return $user;
+ })->firstBy($id)->makeHidden('password');
}
/**
@@ -78,7 +89,7 @@ class UserController extends Controller
*/
public function enable($id)
{
- return $this->user->disOrEnable($id);
+ return $this->user->toggleBy($id);
}
/**
@@ -88,7 +99,7 @@ class UserController extends Controller
*/
public function online(Request $request)
{
- /* @var Users $user */
+ /* @var User $user */
$user = $this->getLoginUser()->withPermissions();
if ($request->isMethod('post')) {
diff --git a/modules/User/Listeners/Login.php b/modules/User/Listeners/Login.php
index 92925b1..481f30f 100644
--- a/modules/User/Listeners/Login.php
+++ b/modules/User/Listeners/Login.php
@@ -9,7 +9,7 @@ use Illuminate\Support\Str;
use Illuminate\Support\Stringable;
use Modules\User\Events\Login as Event;
use Modules\User\Models\LogLogin;
-use Modules\User\Models\Users;
+use Modules\User\Models\User;
class Login
{
@@ -26,7 +26,7 @@ class Login
$this->log($request, (bool) $event->token);
if ($event->token) {
- /* @var Users $user */
+ /* @var User $user */
$user = Auth::guard(getGuardName())->user();
$user->login_ip = $request->ip();
diff --git a/modules/User/Models/Observers/UsersObserver.php b/modules/User/Models/Observers/UsersObserver.php
new file mode 100644
index 0000000..f857213
--- /dev/null
+++ b/modules/User/Models/Observers/UsersObserver.php
@@ -0,0 +1,38 @@
+enabled('permissions')) {
- $this->with = ['roles', 'jobs'];
- }
+ $this->isPermissionModuleEnabled = app(ModuleRepository::class)->enabled('permissions');
+
+ if ($this->isPermissionModuleEnabled) {
+ $this->with = ['roles', 'jobs'];
+ }
}
/**
@@ -56,11 +61,42 @@ trait UserRelations
$permissions = [];
}
- $this->setAttribute('permissions', $permissions->each(fn($permission) => $permission->setAttribute('hidden', $permission->isHidden())));
+ $this->setAttribute('permissions', $permissions->each(fn ($permission) => $permission->setAttribute('hidden', $permission->isHidden())));
return $this;
}
+ /**
+ *
+ * permission module controller.action
+ *
+ * @param string|null $permission
+ * @return bool
+ */
+ public function can(string $permission = null): bool
+ {
+ if (! $this->isPermissionModuleEnabled) {
+ return true;
+ }
+
+ if ($this->isSuperAdmin()) {
+ return true;
+ }
+
+ $this->withPermissions();
+
+ $actions = Collection::make();
+
+ $this->permissions->each(function ($permission) use (&$actions) {
+ if ($permission->isAction()) {
+ [$controller, $action] = explode('@', $permission->permission_mark);
+
+ $actions->add(CatchAdmin::getModuleControllerNamespace($permission->module).$controller.'Controller@'.$action);
+ }
+ });
+
+ return $actions->contains($permission ?: Route::currentRouteAction());
+ }
/**
* get RolesModel
@@ -70,7 +106,7 @@ trait UserRelations
*/
protected function getRolesModel(): string
{
- return '\\' . CatchAdmin::getModuleModelNamespace('permissions') . 'RolesModel';
+ return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'RolesModel';
}
@@ -82,7 +118,7 @@ trait UserRelations
*/
protected function getJobsModel(): string
{
- return '\\'. CatchAdmin::getModuleModelNamespace('permissions') . 'JobsModel';
+ return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'JobsModel';
}
/**
@@ -93,6 +129,6 @@ trait UserRelations
*/
protected function getPermissionsModel(): string
{
- return '\\'. CatchAdmin::getModuleModelNamespace('permissions') . 'PermissionsModel';
+ return '\\'.CatchAdmin::getModuleModelNamespace('permissions').'PermissionsModel';
}
}
diff --git a/modules/User/Models/Users.php b/modules/User/Models/User.php
similarity index 81%
rename from modules/User/Models/Users.php
rename to modules/User/Models/User.php
index 0801d73..990a9da 100644
--- a/modules/User/Models/Users.php
+++ b/modules/User/Models/User.php
@@ -23,12 +23,12 @@ use Illuminate\Auth\Authenticatable;
* @property int $updated_at
* @property string $remember_token
*/
-class Users extends Model implements AuthenticatableContract, JWTSubject
+class User extends Model implements AuthenticatableContract, JWTSubject
{
use Authenticatable, UserRelations;
protected $fillable = [
- 'id', 'username', 'email', 'avatar', 'password', 'remember_token', 'creator_id', 'status', 'login_ip', 'login_at', 'created_at', 'updated_at', 'deleted_at'
+ 'id', 'username', 'email', 'avatar', 'password', 'remember_token', 'creator_id', 'status', 'department_id', 'login_ip', 'login_at', 'created_at', 'updated_at', 'deleted_at'
];
/**
@@ -45,10 +45,17 @@ class Users extends Model implements AuthenticatableContract, JWTSubject
*/
protected $table = 'users';
+ protected array $fields = ['id', 'username', 'email', 'avatar', 'creator_id', 'status', 'department_id', 'created_at'];
+
/**
* @var array|string[]
*/
- protected array $form = ['username', 'email', 'password'];
+ protected array $form = ['username', 'email', 'password', 'department_id'];
+
+ /**
+ * @var array|string[]
+ */
+ protected array $formRelations = ['roles', 'jobs'];
/**
*
diff --git a/modules/User/database/migrations/2022_12_04_060250_create_users.php b/modules/User/database/migrations/2022_12_04_060250_create_users.php
index 902f34d..fd999b3 100644
--- a/modules/User/database/migrations/2022_12_04_060250_create_users.php
+++ b/modules/User/database/migrations/2022_12_04_060250_create_users.php
@@ -25,6 +25,8 @@ return new class () extends Migration {
$table->string('remember_token', 1000)->nullable()->comment('token');
+ $table->integer('department_id')->default(0)->comment('部门ID');
+
$table->integer('creator_id')->default(0);
$table->status();
diff --git a/modules/User/views/user/create.vue b/modules/User/views/user/create.vue
index 9f2a8fd..306e137 100644
--- a/modules/User/views/user/create.vue
+++ b/modules/User/views/user/create.vue
@@ -33,6 +33,21 @@
+
+
+
+
@@ -46,9 +61,6 @@
-
-
-
{{ $t('system.confirm') }}
@@ -59,8 +71,8 @@
import { useCreate } from '/admin/composables/curd/useCreate'
import { useShow } from '/admin/composables/curd/useShow'
-import { onMounted, watch, ref } from 'vue'
-import http from '../../../../resources/admin/support/http'
+import { onMounted, ref } from 'vue'
+import http from '/admin/support/http'
const props = defineProps({
primary: String | Number,
@@ -91,20 +103,16 @@ const { formData, form, loading, submitForm, close } = useCreate(props.api, prop
if (props.primary) {
useShow(props.api, props.primary, formData)
}
+
const emit = defineEmits(['close'])
+close(() => emit('close'))
const departments = ref()
const jobs = ref()
const roles = ref()
onMounted(() => {
- close(() => emit('close'))
-
if (props.hasRoles) {
- http.get('permissions/roles').then(r => {
- roles.value = r.data.data
- })
-
http.get('permissions/departments').then(r => {
departments.value = r.data.data
})
@@ -112,6 +120,10 @@ onMounted(() => {
http.get('permissions/jobs').then(r => {
jobs.value = r.data.data
})
+
+ http.get('permissions/roles').then(r => {
+ roles.value = r.data.data
+ })
}
})
diff --git a/modules/User/views/user/index.vue b/modules/User/views/user/index.vue
index d88b52e..3735108 100644
--- a/modules/User/views/user/index.vue
+++ b/modules/User/views/user/index.vue
@@ -1,52 +1,52 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
-
-