'int', 'user_guid' => 'string', 'user_img' => 'string', 'user_name' => 'string', 'user_password' => 'string', 'user_phone' => 'string', 'user_status' => 'int', 'user_department' => 'string', 'user_position' => 'string', 'user_create_time' => 'datetime', 'user_create_user_guid' => 'string', 'user_update_time' => 'datetime', 'user_update_user_guid' => 'string', 'user_delete_time' => 'datetime', 'user_delete_user_guid' => 'string', ]; // 只读 protected $readonly = [ 'user_id', 'user_guid', 'user_create_time', 'user_create_user_guid' ]; // 开启自动写入时间戳字段 protected $autoWriteTimestamp = 'datetime'; // 创建时间 protected $createTime = 'user_create_time'; // 修改时间 protected $updateTime = 'user_update_time'; public static $dictionaryMap = [ 'user_status' => [ self::STATUS_ENABLE => '启用', self::STATUS_DISABLE => '停用' ], ]; /** * 状态 启用 */ const STATUS_ENABLE = 1; /** * 状态 禁用 */ const STATUS_DISABLE = 2; // 状态查询范围 public function scopeStatus(Query $query, $status = self::STATUS_ENABLE) { $query->where('user_status', $status); } /** * 写入前 * * @param self $model * @return void * @date 2023-01-11 * @example * @author admin * @since 1.0.0 */ public static function onBeforeWrite(self $model): void { self::checkRepeatData($model); } /** * 新增前 * * @date 2022-02-22 * @example * @author admin * @since 1.0.0 */ public static function onBeforeInsert(self $model): void { $model->completeCreateField(); } /** * 更新前 * * @date 2022-02-28 * @example * @author admin * @since 1.0.0 */ public static function onBeforeUpdate(self $model): void { $model->completeUpdateField(); } /** * 删除前 * * @date 2022-02-28 * @example * @author admin * @since 1.0.0 */ public static function onBeforeDelete(self $model): void { $model->completeDeleteField(); } /** * 用户名搜索器 * * @param Query $query * @param [type] $value * @param [type] $data * @return void * @date 2022-02-28 * @example * @author admin * @since 1.0.0 */ public function searchUserNameAttr(Query $query, $value, $data): void { if ($value) { $query->whereLike(join('|', [ 'user_name', // 'user_phone' ]), "%$value%"); } } /** * 设置用户密码 * * @param string $value * @return string * @date 2022-12-28 * @example * @author admin * @since 1.0.0 */ public function setUserPasswordAttr(string $value): string { return self::encryptPassword($value); } /** * 获取用户管理员 * * @date 2022-03-08 * @example * @author admin * @since 1.0.0 */ public function getUserAdminAttr(): bool { return $this->user_id == 1; } /** * 用户登录 * * @return Token * @date 2023-01-03 * @example * @author admin * @since 1.0.0 */ public function login(): Token { if ($this->user_status != self::STATUS_ENABLE) { throwErrorMsg('该用户已被停用'); } $menus = $this->getUserMenu(); $api = []; foreach ($menus as $menu) { $api = array_merge($api, explode(',', $menu['menu_api_url'])); } $api = array_values(array_filter(array_unique($api))); if (!$api) { throwErrorMsg('无权登录'); } return Token::login($this->user_guid, [ 'menu' => $menus, 'api' => $api, ]); } /** * 获取用户菜单 * * @date 2022-03-15 * @example * @author admin * @since 1.0.0 */ public function getUserMenu(): array { $result = []; $query = Menu::join('menu_api', 'menu_api.menu_guid = menu.menu_guid', 'left')->field([ 'menu.menu_guid', 'menu.menu_parent_guid', 'menu.menu_name', 'menu.menu_url', 'menu.menu_show', 'menu.menu_icon', 'group_concat(menu_api.menu_api_url)' => 'menu_api_url' ])->order([ 'menu.menu_index', 'menu.menu_order' => 'desc', ])->group('menu.menu_guid'); if ($this->user_admin) { $result = $query->select()->toArray(); } else { $menus = []; $roles = $this->roles()->with([ 'menus' ])->select(); foreach ($roles as $role) { $menus = array_merge($menus, $role->menus->column('menu_guid')); } $result = $query->where([ ['menu.menu_guid', 'in', $menus] ])->select()->toArray(); } return $result; } /** * 数据查重 * * @param self $model * @return void * @date 2022-03-11 * @example * @author admin * @since 1.0.0 */ private static function checkRepeatData(self $model) { Validate::unique(self::class, $model->user_guid, $model->getData(), [ 'user_account' => '账户', 'user_phone' => '手机号', ]); } /** * 密码加密 * * @param string $password * @date 2022-02-22 * @example * @author admin * @since 1.0.0 */ public static function encryptPassword(string $password): string { return md5($password); } /** * 获取角色 * * @date 2022-03-11 * @example * @author admin * @since 1.0.0 */ public function roles(): BelongsToMany { return $this->belongsToMany( Role::class, UserRole::class, 'role_guid', 'user_guid' ); } /** * 新增用户角色 */ public static function addUserRole($user_guid, $params): void { $user_role_arr = $params['roles']; foreach ($user_role_arr as $role => $item) { Db::startTrans(); try { $add_data = [ 'user_guid' => $user_guid, 'role_guid' => $item, ]; $user_role = ModelUserRole::create($add_data); Db::commit(); } catch (\Throwable $th) { Db::rollback(); throw $th; } } } /** * 编辑用户角色 */ public static function editUserRole($params): void { // 从学生服务(副表)查询出所有当前学生的服务,进行删除 ModelUserRole::where('user_guid', $params['user_guid'])->select()->delete(); // 再把传值的数据,写入副表 $user_role_arr = $params['roles']; foreach ($user_role_arr as $key => $item) { Db::startTrans(); try { $add_data = [ 'user_guid' => $params['user_guid'], 'role_guid' => $item, ]; ModelUserRole::create($add_data); Db::commit(); } catch (\Throwable $th) { Db::rollback(); throw $th; } } } /** * 用户角色guid获取器 */ public function getRolesAttr($value, $data) { $user_guid = $data['user_guid']; $user_role_guid_arr = ModelUserRole::field([ 'role_guid', ])->where('user_guid', $user_guid)->select(); $arr = []; foreach ($user_role_guid_arr as $key => $value) { $arr[] = $value['role_guid']; } return $arr; // return array_values($user_key_guid_arr); } /** * 用户角色名称获取器 */ public function getRoleNameAttr($value, $data) { $user_guid = $data['user_guid']; $user_role_guid_arr = ModelUserRole::field([ 'role_guid', ])->where('user_guid', $user_guid)->select(); $arr = []; foreach ($user_role_guid_arr as $key => $value) { $model = Role::where('role_guid', $value['role_guid'])->find()->role_name; $arr[] = $model; } return implode(",", $arr); // return array_values($user_key_guid_arr); } /** * 用户角色名 */ public static function getRoleName($data) { $user_guid = $data['user_guid']; $user_role_guid_arr = ModelUserRole::field([ 'role_guid', ])->where('user_guid', $user_guid)->select(); $arr = []; foreach ($user_role_guid_arr as $key => $value) { $model = Role::where('role_guid', $value['role_guid'])->find()->role_name; $arr[] = $model; } return implode(",", $arr); // return array_values($user_key_guid_arr); } /** * 角色名称转角色guid数组 */ public static function RoleNameToRoleGuidArr($params) { $roles = explode(",", $params['roles']); $user_role_guid_arr = []; foreach ($roles as $key => $item) { $role = Role::where('role_name', $item)->find(); if (!$role) throwErrorMsg('角色不存在!'); $user_role_guid_arr[] = $role->role_guid; } return $user_role_guid_arr; } /** * 导出Excel */ public static function exportExcel($select) { $data = [[ '用户名', '头像', '角色', '手机号', ]]; foreach ($select as $key => $val) { $val['user_img'] = Excel::ExportImgFiled($val['user_img']); $user_role_name = self::getRoleName($val); $data[] = [ $val['user_name'], $val['user_img'], $user_role_name, $val['user_phone'], ]; } $excel = (new Excel())->exporTsheet($data); $excel->save('用户.xlsx'); } /** * 导入数据处理 */ public static function HanleImportData($value) { // 判断用户是否存在 $user_name = $value['user_name']; $user_type = self::where('user_name', $user_name)->find(); if ($user_type) throwErrorMsg("{$user_name} 用户已存在,导入失败!"); // 判断角色是否存在 $roles_arr = explode(",", $value['roles']); foreach ($roles_arr as $key => $item) { $role = Role::where('role_name', $item)->find(); if (!$role) throwErrorMsg("{$item} 角色不存在,导入失败!"); } $password = md5($value['user_password']); $model = self::create([ 'user_name' => $value['user_name'], 'user_img' => $value['user_img'], 'user_phone' => $value['user_phone'], 'user_password' => $password, 'user_status' => 1, ]); $user_guid = $model->user_guid; $value['roles'] = self::RoleNameToRoleGuidArr($value); self::addUserRole($user_guid, $value); } /** * 导入Excel */ public static function importExcel($file) { Db::startTrans(); try { $excel = new Excel($file); // 表头 $data = $excel->parseExcel( [ [ 'title' => '用户名', 'validate' => 'require', 'field' => 'user_name', ], [ 'title' => '头像', 'field' => 'user_img', ], [ 'title' => '角色', 'validate' => 'require', 'field' => 'roles', ], [ 'title' => '手机号', 'field' => 'user_phone', ], [ 'title' => '密码', 'field' => 'user_password', ] ], [ 'titleLine' => [1] ] ); if (!$data) throwErrorMsg('excel无数据', 1); $error = []; foreach ($data as $line => $value) { try { self::HanleImportData($value); $error[] = "{$line} 用户:【{$value['user_name']}】新增成功!
"; } catch (\Throwable $th) { $error[] = "{$line} 用户:【{$value['user_name']}】{$th->getMessage()}
"; } } Db::commit(); return implode(', ', $error); } catch (\Throwable $th) { Db::rollback(); throw $th; } } }