Files

160 lines
4.7 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
namespace ywxapp\model;
use think\model\concern\SoftDelete;
use ywxapp\model\BaseModel;
/**
* MemberRule 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
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');
}
}