Files
YwxAppThink/ywxapp/model/MemberRule.php
T
ywxapp 1d49e6f5ee feat: 公共表更名 common/member 前缀 + 插件命令自动加载 + 版本 1.1.1
- 18 张公共表更名(addon/attachment/configure/links/spider_log/spider_stat/sms/notice/ad/task/prop/medal/help/card -> common_*,member_wallets->member_wallet,score_rule/score_log -> member_*,addon_config->common_addonconf),模型全部对齐新表名,Db 直引用清零
- Attachment 模型补  表名绑定,修复富文本上传查 wxapp_attachment 1146 隐患
- install.sql + 迁移 SQL:backend_admin/backend_role delete_at 默认 0,修复软删除(NULL != 0)误过滤导致后台菜单为空
- AppService::boot() 支持插件 info.php 声明 commands 自动注册插件命令(psr-4 自动加载,坏类名自动跳过)
- 各插件(haonav/mqttbroker/wxchat/articles/blog/forum 等)字段与配置同步调整
- 框架版本 1.1.0 -> 1.1.1
2026-08-20 20:19:15 +08:00

158 lines
4.6 KiB
PHP
Raw 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,
'autoWriteTimestamp' => 'int',
'createTime' => 'create_at',
'updateTime' => 'update_at',
'deleteTime' => 'delete_at',
'defaultSoftDelete' => 0,
'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');
}
}