// +---------------------------------------------------------------------- namespace ywxapp\model; use think\model\concern\SoftDelete; use ywxapp\model\BaseModel; /** * MemberRule 类 * * @author ywxapp */ class MemberRule extends BaseModel { use SoftDelete; protected function getOptions(): array { return [ 'strict' => false, 'name' => 'member_rule', 'autoWriteTimestamp' => 'int', 'createTime' => 'create_at', 'updateTime' => 'update_at', 'deleteTime' => 'delete_at', 'defaultSoftDelete' => 0, // 'dateFormat' => 'Y-m-d H:i:s', 'append' => ['is_parent' ], 'hidden' => ['password', 'create_at', 'update_at', 'delete_at'], 'readonly' => ['id'], ]; } // 拥有该权限的角色 public function groups() { return $this->belongsToMany(MemberGroup::class, MemberGroupRule::class, 'gid', 'rid'); } // 拥有该权限的用户(通过角色) public function users() { return $this->belongsToMany(MemberUser::class, MemberGroupRule::class, 'uid', 'gid')->via('roles'); } public static function onAfterRead($data) { // 这里可以直接使用$this访问当前模型 // if ($data->type == 2) { // $data->append(['href', 'openType']); // $data->openType = '_iframe'; // $data->href = $data->route; // } } public static function onAfterDelete($data) { MemberGroupRule::where('rid', $data->id)->delete(); } /** * 获取器:获取状态文本 */ public function getIsParentAttr($value, $data) { return $this->where('pid', $data['id'])->count() > 0; } /** * 将扁平菜单数组转为树形结构 * @param array $menus 扁平菜单列表(每个元素是数组) * @param int $parentId 父ID(默认0表示根) * @return array 树形结构 */ public static function buildTree(array $menus, int $parentId = 0): array { $branch = []; foreach ($menus as $menu) { if ($menu['pid'] == $parentId) { $children = self::buildTree($menus, $menu['id']); if (! empty($children)) { $menu['children'] = $children; } $branch[] = $menu; } } return $branch; } /** * 递归生成树形结构 * @param array $list 原始数据 * @param int $pid 父级ID * @return array */ public static function toTree($list, $pid = 0) { $tree = []; foreach ($list as $item) { if ($item['pid'] == $pid) { $children = self::toTree($list, $item['id']); if ($children) { $item['children'] = $children; } $tree[] = $item; } } return $tree; } public static function toTreeS($list, $pid = 0, $level = 0) { $tree = []; foreach ($list as $item) { if ($item['pid'] == $pid) { // ✅ 创建新变量,不修改原始数据 // $item['title'] = str_repeat(' ', $level * 2) . ($level > 0 ? '├─ ' : '') . $item['title']; // 或者用 |-- 但控制层级 $item['title'] = str_repeat('|-- ', $level + 1) . $item['title']; $children = self::toTreeS($list, $item['id'], $level + 1); if ($children) { $item['children'] = $children; } $tree[] = $item; } } return $tree; } /** * 获取所有权限并转为树形 * @return array */ public static function getTreeList() { $list = self::order('sort', 'asc')->select()->toArray(); return self::toTree($list); } /** * 表结构自愈:建表 + 关键列兜底(install.sql 为事实源)。 * 查询/写入前调用,避免老库缺表导致 1146。 */ public static function ensureSchema(): void { BaseModel::ensureTableFromInstall(BaseModel::currentPrefix(), 'member_rule'); } }