From fc0f331f298884ba36c3aa79b60c0bcc2be26fa2 Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Tue, 25 Feb 2025 17:03:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=86=E9=A1=B5/=E8=AF=A6=E6=83=85/=E6=96=B0=E5=A2=9E/?= =?UTF-8?q?=E6=9B=B4=E6=96=B0/=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/v1/User.php | 157 ++++++++++++++++++ app/admin/model/v1/SysRoleAuthorityModel.php | 14 ++ app/admin/model/v1/SysRoleModel.php | 14 ++ app/admin/model/v1/SysUserModel.php | 35 +++- app/admin/route/v1.php | 18 ++ app/admin/validate/v1/SysUserValidate.php | 68 ++++++++ app/common/model/SysRoleBaseModel.php | 29 ++++ app/common/model/SysUserBaseModel.php | 6 +- .../20241230054930_create_sys_user.php | 2 +- 9 files changed, 338 insertions(+), 5 deletions(-) create mode 100644 app/admin/controller/v1/User.php create mode 100644 app/admin/model/v1/SysRoleAuthorityModel.php create mode 100644 app/admin/model/v1/SysRoleModel.php create mode 100644 app/admin/validate/v1/SysUserValidate.php create mode 100644 app/common/model/SysRoleBaseModel.php diff --git a/app/admin/controller/v1/User.php b/app/admin/controller/v1/User.php new file mode 100644 index 00000000..e09ecb2d --- /dev/null +++ b/app/admin/controller/v1/User.php @@ -0,0 +1,157 @@ +get([ + 'username', + 'status', + 'page/d' => 1, + 'size/d' => 10 + ]); + + $users = SysUserModel::withoutField([ + 'password', + 'salt', + 'created_at', + 'updated_at', + 'deleted_at' + ]) + ->with(['role' => function($query) { + $query->field(['id', 'name' => 'role_name']); + }]) + ->withSearch(['username'], [ + 'username' => $params['username']??null, + ]) + ->status($params['status']??null) + ->order('id', 'desc') + ->paginate([ + 'list_rows' => $params['size'], + 'page' => $params['page'], + ]) + ->bindAttr('role', ['role_name']) + ->hidden(['role_id', 'role']); + + return success('获取成功', $users); + } + + // 用户详情 + public function read($id) + { + $id = request()->param('id'); + + $user = SysUserModel::withoutField([ + 'password', + 'salt', + 'created_at', + 'updated_at', + 'deleted_at', + ]) + ->bypk($id) + ->find(); + if (empty($user)) { + return error('用户不存在'); + } + + return success('获取成功', $user); + } + + // 用户新增 + public function save() + { + $post = request()->post([ + 'username', + 'password', + 'repassword', + 'nickname', + 'avatar', + 'mobile', + 'email', + 'role_id', + 'status' => 1, + ]); + $post = array_merge($post, ['salt' => random_str(16)]); + + $validate = new SysUserValidate; + if (!$validate->scene('create')->check($post)) { + return error($validate->getError()); + } + + $post['password'] = password_with_salt($post['password'], $post['salt']); + unset($post['repassword']); + $user = SysUserModel::create($post); + if ($user->isEmpty()) { + return error('新增失败'); + } + + return success('新增成功'); + } + + // 用户更新 + public function update() + { + $id = request()->param('id'); + $put = request()->put([ + 'username', + 'password', + 'repassword', + 'nickname', + 'avatar', + 'mobile', + 'email', + 'role_id', + 'status' => 1, + ]); + $data = array_merge($put, ['id' => $id, 'salt' => random_str(16)]); + + $validate = new SysUserValidate; + if (!$validate->check($data)) { + return error($validate->getError()); + } + + $user = SysUserModel::bypk($id)->find(); + if (empty($user)) { + return error('请确认要操作的对象是否存在'); + } + + if (!empty($data['password'])) { + $data['password'] = password_with_salt($data['password'], $data['salt']); + } else { + unset($data['password']); + } + unset($data['repassword']); + if (!$user->save($data)) { + return error('操作失败'); + } + + return success('操作成功'); + } + + // 用户删除 + public function delete() + { + $id = request()->param('id'); + + $user = SysUserModel::bypk($id)->find(); + if (empty($user)) { + return error('请确认要操作的对象是否存在'); + } + + if (!$user->delete()) { + return error('操作失败'); + } + + return success('操作成功'); + } +} diff --git a/app/admin/model/v1/SysRoleAuthorityModel.php b/app/admin/model/v1/SysRoleAuthorityModel.php new file mode 100644 index 00000000..6c0e7b38 --- /dev/null +++ b/app/admin/model/v1/SysRoleAuthorityModel.php @@ -0,0 +1,14 @@ +belongsTo(SysRoleModel::class, 'role_id', 'id'); + } + + // 用户名搜索 + public function searchUsernameAttr($query, $value) + { + if (empty($value)) { + return; + } + $query->where('username', 'like', "%{$value}%"); + } + // 用户名查询范围 public function scopeUsernameOrMobile($query, $username) { - return $query->where('username', '=', $username)->whereOr('mobile', '=', $username); + $query->where('username', '=', $username)->whereOr('mobile', '=', $username); + } + + // 状态查询 + public function scopeStatus($query, $status) + { + if (empty($status)) { + return; + } + $query->where('status', '=', $status); } } diff --git a/app/admin/route/v1.php b/app/admin/route/v1.php index 2584a725..8e8bfd2a 100644 --- a/app/admin/route/v1.php +++ b/app/admin/route/v1.php @@ -331,6 +331,24 @@ Route::group('v1', function () { Route::delete('delete/:id', 'AttachmentTrash/delete'); }); }); + + // 用户管理 + Route::group('user', function() { + // 用户分页 + Route::get('index', 'User/index'); + + // 用户详情 + Route::get('read/:id', 'User/read'); + + // 用户新增 + Route::post('save', 'User/save'); + + // 用户更新 + Route::put('update/:id', 'User/update'); + + // 用户删除 + Route::delete('delete/:id', 'User/delete'); + }); })->prefix('v1.'); Route::miss(function() { diff --git a/app/admin/validate/v1/SysUserValidate.php b/app/admin/validate/v1/SysUserValidate.php new file mode 100644 index 00000000..54528358 --- /dev/null +++ b/app/admin/validate/v1/SysUserValidate.php @@ -0,0 +1,68 @@ + ['规则1','规则2'...] + * + * @var array + */ + protected $rule = [ + 'id' => 'require|integer', + 'username' => 'require|unique:sys_user|max:64', + 'password' => 'require|max:64', + 'repassword' => 'requireWith:password|confirm:password', + 'salt' => 'require|max:16', + 'role_id' => 'require|integer', + 'nickname' => 'max:64', + 'avatar' => 'max:255', + 'mobile' => 'mobile', + 'email' => 'email', + 'status' => 'in:-1,1', + ]; + + /** + * 定义错误信息 + * 格式:'字段名.规则名' => '错误信息' + * + * @var array + */ + protected $message = [ + 'id.require' => 'ID不能为空', + 'id.integer' => 'ID必须为整数', + 'username.require' => '用户名不能为空', + 'username.unique' => '用户名已存在', + 'username.max' => '用户名最多不能超过64个字符', + 'password.require' => '密码不能为空', + 'password.max' => '密码最多不能超过64个字符', + 'repassword.requireWith' => '确认密码不能为空', + 'repassword.confirm' => '两次密码输入不一致', + 'salt.require' => '盐不能为空', + 'salt.max' => '盐最多不能超过16个字符', + 'role_id.require' => '角色ID不能为空', + 'role_id.integer' => '角色ID必须为整数', + 'nickname.max' => '昵称最多不能超过64个字符', + 'avatar.max' => '头像最多不能超过255个字符', + 'mobile' => '手机号格式错误', + 'email' => '邮箱格式错误', + 'status.in' => '状态值必须是-1或1', + ]; + + // 新增校验场景 + public function sceneCreate() + { + return $this->remove('id', 'require|integer'); + } + + // 更新校验场景 + public function sceneUpdate() + { + return $this->remove('repassword', 'requireWith:password|confirm:password'); + } +} diff --git a/app/common/model/SysRoleBaseModel.php b/app/common/model/SysRoleBaseModel.php new file mode 100644 index 00000000..b01b6bd5 --- /dev/null +++ b/app/common/model/SysRoleBaseModel.php @@ -0,0 +1,29 @@ + 'int', + 'pid' => 'int', + 'name' => 'string', + 'desc' => 'string', + 'status' => 'int', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + 'deleted_at' => 'datetime', + ]; +} diff --git a/app/common/model/SysUserBaseModel.php b/app/common/model/SysUserBaseModel.php index 5da2b2c8..30dd59ab 100644 --- a/app/common/model/SysUserBaseModel.php +++ b/app/common/model/SysUserBaseModel.php @@ -3,12 +3,11 @@ declare (strict_types = 1); namespace app\common\model; -use think\Model; - /** + * 用户模型 * @mixin \think\Model */ -class SysUserBaseModel extends Model +class SysUserBaseModel extends BaseModel { // 表名 protected $name = 'sys_user'; @@ -30,5 +29,6 @@ class SysUserBaseModel extends Model 'status' => 'int', 'created_at' => 'datetime', 'updated_at' => 'datetime', + 'deleted_at' => 'datetime', ]; } diff --git a/database/migrations/20241230054930_create_sys_user.php b/database/migrations/20241230054930_create_sys_user.php index d5944be9..25f6ae12 100644 --- a/database/migrations/20241230054930_create_sys_user.php +++ b/database/migrations/20241230054930_create_sys_user.php @@ -34,7 +34,7 @@ class CreateSysUser extends Migrator ->addColumn('role_id', 'integer', ['limit' => 11, 'null' => false, 'comment' => '角色ID']) ->addColumn('nickname', 'string', ['limit' => 64, 'null' => false, 'comment' => '昵称']) ->addColumn('avatar', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '头像']) - ->addColumn('mobile', 'biginteger', ['limit' => 11, 'null' => true, 'default' => null, 'comment' => '手机号码']) + ->addColumn('mobile', 'string', ['limit' => 11, 'null' => true, 'default' => null, 'comment' => '手机号码']) ->addColumn('email', 'string', ['limit' => 128, 'null' => true, 'default' => null, 'comment' => '邮箱地址']) ->addColumn('status', 'boolean', ['null' => false, 'default' => 1, 'comment' => '-1为禁用, 1为启用']) ->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])