菜单权限&工单邮件

This commit is contained in:
mzl@hnxinyouhe.com
2025-08-13 14:18:11 +08:00
parent c59758f03c
commit 122628663c
5 changed files with 558 additions and 256 deletions
+3 -3
View File
@@ -95,19 +95,19 @@ class ResourceService
protected function afterServiceListAll($data) protected function afterServiceListAll($data)
{ {
$data = Tree::buildWithAuthListAndReference($data->toArray()); $data = Tree::buildMenuTreeWithReference($data->toArray());
return $data; return $data;
} }
protected function afterServiceMenuList($data) protected function afterServiceMenuList($data)
{ {
$data = Tree::buildWithReference($data->toArray()); $data = Tree::buildMenuTree($data->toArray());
return $data; return $data;
} }
protected function afterServiceMenuTreeList($data) protected function afterServiceMenuTreeList($data)
{ {
$data = Tree::buildWithReference($data->toArray()); $data = Tree::buildMenuTree($data->toArray());
return $data; return $data;
} }
} }
+429 -244
View File
@@ -4,30 +4,379 @@ namespace app\common\utils;
class Tree class Tree
{ {
// /**
// * 递归构建树形结构
// *
// * @param array $data 数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @param int $level 当前层级
// * @return array
// */
// public static function build(array $data, int $parentId = 0, string $pidField = 'parent_id', string $idField = 'id', int $level = 0): array
// {
// $tree = [];
// foreach ($data as $item) {
// if ($item[$pidField] == $parentId) {
// $item['level'] = $level;
// $children = static::build($data, $item[$idField], $pidField, $idField, $level + 1);
// if (!empty($children)) {
// $item['children'] = $children;
// }
// $tree[] = $item;
// }
// }
// return $tree;
// }
// /**
// * 使用引用方式构建树形结构(性能更好)
// *
// * @param array $data 数据列表
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @return array
// */
// public static function buildWithReference(array $data, string $pidField = 'parent_id', string $idField = 'id'): array
// {
// $items = [];
// $tree = [];
// // 建立以id为索引的数组
// foreach ($data as $item) {
// $item['level'] = 0;
// $items[$item[$idField]] = $item;
// }
// // 构建树形结构
// foreach ($items as $id => $item) {
// if ($item[$pidField] == 0) {
// $tree[] = &$items[$id];
// } else {
// if (isset($items[$item[$pidField]])) {
// $items[$id]['level'] = $items[$item[$pidField]]['level'] + 1;
// if (!isset($items[$item[$pidField]]['children'])) {
// $items[$item[$pidField]]['children'] = [];
// }
// $items[$item[$pidField]]['children'][] = &$items[$id];
// }
// }
// }
// return $tree;
// }
// /**
// * 将树形结构扁平化为列表(带层级前缀)
// *
// * @param array $tree 树形结构数据
// * @param string $prefix 前缀字符
// * @param string $field 显示字段名
// * @param int $level 层级
// * @return array
// */
// public static function flattenWithPrefix(array $tree, string $prefix = '--', string $field = 'name', int $level = 0): array
// {
// $result = [];
// foreach ($tree as $item) {
// $item[$field . '_with_prefix'] = str_repeat($prefix, $item['level']) . $item[$field];
// $result[] = $item;
// if (isset($item['children']) && !empty($item['children'])) {
// $children = static::flattenWithPrefix($item['children'], $prefix, $field, $item['level'] + 1);
// $result = array_merge($result, $children);
// }
// }
// return $result;
// }
// /**
// * 根据父ID查找所有子节点(包括子孙节点)
// *
// * @param array $data 数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @return array
// */
// public static function findChildren(array $data, int $parentId, string $pidField = 'parent_id', string $idField = 'id'): array
// {
// $children = [];
// foreach ($data as $item) {
// if ($item[$pidField] == $parentId) {
// $children[] = $item;
// $grandChildren = static::findChildren($data, $item[$idField], $pidField, $idField);
// $children = array_merge($children, $grandChildren);
// }
// }
// return $children;
// }
// /**
// * 获取指定节点的所有父级节点
// *
// * @param array $data 数据列表
// * @param int $id 当前节点ID
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @return array
// */
// public static function getParents(array $data, int $id, string $pidField = 'parent_id', string $idField = 'id'): array
// {
// $parents = [];
// foreach ($data as $item) {
// if ($item[$idField] == $id) {
// if ($item[$pidField] != 0) {
// $parents[] = $item;
// $parentParents = static::getParents($data, $item[$pidField], $pidField, $idField);
// $parents = array_merge($parents, $parentParents);
// }
// break;
// }
// }
// return $parents;
// }
// /**
// * 获取指定节点的子孙节点ID列表
// *
// * @param array $data 数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @return array
// */
// public static function getChildrenIds(array $data, int $parentId, string $pidField = 'parent_id', string $idField = 'id'): array
// {
// $ids = [];
// $children = static::findChildren($data, $parentId, $pidField, $idField);
// foreach ($children as $child) {
// $ids[] = $child[$idField];
// }
// return $ids;
// }
// /**
// * 检查是否有子节点
// *
// * @param array $data 数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @return bool
// */
// public static function hasChildren(array $data, int $parentId, string $pidField = 'parent_id'): bool
// {
// foreach ($data as $item) {
// if ($item[$pidField] == $parentId) {
// return true;
// }
// }
// return false;
// }
// /**
// * 构建带有权限列表的资源树(权限不显示在树结构中)
// *
// * @param array $data 资源数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @param string $typeField 类型字段名
// * @param string $permissionType 权限类型标识
// * @param int $level 当前层级
// * @return array
// */
// public static function buildWithAuthList(
// array $data,
// int $parentId = 0,
// string $pidField = 'parent_id',
// string $idField = 'id',
// string $typeField = 'type',
// string $permissionType = 'permission',
// int $level = 0
// ): array {
// $tree = [];
// foreach ($data as $item) {
// // 只处理指定父级的非权限节点
// if ($item[$pidField] == $parentId && $item[$typeField] != $permissionType) {
// $item['level'] = $level;
// // 递归处理子节点(非权限类型)
// $children = static::buildWithAuthList($data, $item[$idField], $pidField, $idField, $typeField, $permissionType, $level + 1);
// if (!empty($children)) {
// $item['children'] = $children;
// }
// // 收集当前节点下的所有权限
// $item['auth_list'] = static::collectDirectPermissions($data, $item[$idField], $pidField, $typeField, $permissionType);
// $tree[] = $item;
// }
// }
// return $tree;
// }
// /**
// * 收集指定节点下的直接权限项(只收集直接子节点中的权限)
// *
// * @param array $data 数据列表
// * @param int $parentId 父级ID
// * @param string $pidField 父级字段名
// * @param string $typeField 类型字段名
// * @param string $permissionType 权限类型标识
// * @return array
// */
// public static function collectDirectPermissions1(
// array $data,
// int $parentId,
// string $pidField = 'parent_id',
// string $typeField = 'type',
// string $permissionType = 'permission'
// ): array {
// $permissions = [];
// foreach ($data as $item) {
// // 收集直接子节点中的权限类型
// if ($item[$pidField] == $parentId && $item[$typeField] == $permissionType) {
// $permissions[] = $item;
// }
// }
// return $permissions;
// }
// /**
// * 使用引用方式构建带有权限列表的资源树(权限不显示在树结构中)
// *
// * @param array $data 资源数据列表
// * @param string $pidField 父级字段名
// * @param string $idField ID字段名
// * @param string $typeField 类型字段名
// * @param string $permissionType 权限类型标识
// * @return array
// */
// public static function buildWithAuthListAndReference(
// array $data,
// string $pidField = 'parent_id',
// string $idField = 'id',
// string $typeField = 'type',
// string $permissionType = 'permission'
// ): array {
// $items = [];
// $tree = [];
// // 建立以id为索引的数组(只包含非权限节点)
// foreach ($data as $item) {
// if ($item[$typeField] != $permissionType) {
// $item['level'] = 0;
// $items[$item[$idField]] = $item;
// }
// }
// // 构建树形结构
// foreach ($items as $id => $item) {
// if ($item[$pidField] == 0) {
// $tree[] = &$items[$id];
// } else {
// if (isset($items[$item[$pidField]])) {
// $items[$id]['level'] = $items[$item[$pidField]]['level'] + 1;
// if (!isset($items[$item[$pidField]]['children'])) {
// $items[$item[$pidField]]['children'] = [];
// }
// $items[$item[$pidField]]['children'][] = &$items[$id];
// }
// }
// }
// // 为每个节点添加权限列表
// foreach ($items as &$item) {
// $item['auth_list'] = static::collectDirectPermissions($data, $item[$idField], $pidField, $typeField, $permissionType);
// }
// return $tree;
// }
// 8.13 add
/** /**
* 递归构建树形结构 * 构建前端需要的菜单树结构
* *
* @param array $data 数据列表 * @param array $data 服务端菜单数据
* @param int $parentId 父级ID * @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @param int $level 当前层级
* @return array * @return array
*/ */
public static function build(array $data, int $parentId = 0, string $pidField = 'parent_id', string $idField = 'id', int $level = 0): array public static function buildMenuTree(array $data, int $parentId = 0): array
{ {
$tree = []; $tree = [];
foreach ($data as $item) { foreach ($data as $item) {
if ($item[$pidField] == $parentId) { // 只处理非权限类型的节点
$item['level'] = $level; if ($item['parent_id'] == $parentId && $item['type'] != 'permission') {
$children = static::build($data, $item[$idField], $pidField, $idField, $level + 1); // 转换数据结构以匹配前端需要的格式
$menuItem = [
'id' => $item['id'],
'path' => $item['url'] ?? '',
'name' => $item['name'],
'component' => $item['url'] ?? '',
'meta' => [
'title' => $item['name'],
'icon' => $item['icon'] ?? '',
'isHide' => !empty($item['is_hide']),
'isHideTab' => !empty($item['is_hide_tab']),
'keepAlive' => !empty($item['keep_alive']),
]
];
if (!empty($children)) { // 收集当前节点下的所有权限
$item['children'] = $children; $permissions = static::collectDirectPermissions($data, $item['id']);
if (!empty($permissions)) {
$authList = [];
foreach ($permissions as $permission) {
$authList[] = [
'id' => $permission['id'],
'title' => $permission['name'] ?? '',
'authMark' => $permission['code'] ?? ''
];
}
$menuItem['meta']['authList'] = $authList;
} }
$tree[] = $item; // 将服务端额外字段放入meta中
$extraFields = static::getExtraFields($item);
if (!empty($extraFields)) {
$menuItem['meta'] = array_merge($menuItem['meta'], $extraFields);
}
// 递归处理子菜单
$children = static::buildMenuTree($data, $item['id']);
if (!empty($children)) {
$menuItem['children'] = $children;
}
$tree[] = $menuItem;
} }
} }
@@ -35,201 +384,72 @@ class Tree
} }
/** /**
* 使用引用方式构建树形结构(性能更好) * 使用引用方式构建前端需要的菜单树结构(性能更好)
* *
* @param array $data 数据列表 * @param array $data 服务端菜单数据
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @return array * @return array
*/ */
public static function buildWithReference(array $data, string $pidField = 'parent_id', string $idField = 'id'): array public static function buildMenuTreeWithReference(array $data): array
{ {
$items = []; $items = [];
$tree = []; $tree = [];
// 建立以id为索引的数组 // 过滤出菜单类型的节点并转换数据结构
foreach ($data as $item) { $menuData = array_filter($data, function($item) {
$item['level'] = 0; return ($item['type'] ?? '') != 'permission';
$items[$item[$idField]] = $item; });
// 建立以id为索引的数组并转换数据结构
foreach ($menuData as $item) {
$items[$item['id']] = [
'id' => $item['id'],
'path' => $item['url'] ?? '',
'name' => $item['name'],
'component' => $item['url'] ?? '',
'meta' => [
'title' => $item['name'],
'icon' => $item['icon'] ?? '',
'isHide' => !empty($item['is_hide']),
'isHideTab' => !empty($item['is_hide_tab']),
'keepAlive' => !empty($item['keep_alive']),
]
];
// 将服务端额外字段放入meta中
$extraFields = static::getExtraFields($item);
if (!empty($extraFields)) {
$items[$item['id']]['meta'] = array_merge($items[$item['id']]['meta'], $extraFields);
}
} }
// 构建树形结构 // 构建树形结构
foreach ($items as $id => $item) { foreach ($menuData as $item) {
if ($item[$pidField] == 0) { if ($item['parent_id'] == 0) {
$tree[] = &$items[$id]; $tree[] = &$items[$item['id']];
} else { } else {
if (isset($items[$item[$pidField]])) { if (isset($items[$item['parent_id']])) {
$items[$id]['level'] = $items[$item[$pidField]]['level'] + 1; if (!isset($items[$item['parent_id']]['children'])) {
$items[$item['parent_id']]['children'] = [];
if (!isset($items[$item[$pidField]]['children'])) {
$items[$item[$pidField]]['children'] = [];
} }
$items[$item['parent_id']]['children'][] = &$items[$item['id']];
$items[$item[$pidField]]['children'][] = &$items[$id];
} }
} }
} }
return $tree; // 为每个节点添加权限列表
} foreach ($items as &$item) {
$parentId = $item['id'];
/** $permissions = static::collectDirectPermissions($data, $parentId);
* 将树形结构扁平化为列表(带层级前缀) if (!empty($permissions)) {
* $authList = [];
* @param array $tree 树形结构数据 foreach ($permissions as $permission) {
* @param string $prefix 前缀字符 $authList[] = [
* @param string $field 显示字段名 'id' => $permission['id'],
* @param int $level 层级 'title' => $permission['name'] ?? '',
* @return array 'authMark' => $permission['code'] ?? ''
*/ ];
public static function flattenWithPrefix(array $tree, string $prefix = '--', string $field = 'name', int $level = 0): array
{
$result = [];
foreach ($tree as $item) {
$item[$field . '_with_prefix'] = str_repeat($prefix, $item['level']) . $item[$field];
$result[] = $item;
if (isset($item['children']) && !empty($item['children'])) {
$children = static::flattenWithPrefix($item['children'], $prefix, $field, $item['level'] + 1);
$result = array_merge($result, $children);
}
}
return $result;
}
/**
* 根据父ID查找所有子节点(包括子孙节点)
*
* @param array $data 数据列表
* @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @return array
*/
public static function findChildren(array $data, int $parentId, string $pidField = 'parent_id', string $idField = 'id'): array
{
$children = [];
foreach ($data as $item) {
if ($item[$pidField] == $parentId) {
$children[] = $item;
$grandChildren = static::findChildren($data, $item[$idField], $pidField, $idField);
$children = array_merge($children, $grandChildren);
}
}
return $children;
}
/**
* 获取指定节点的所有父级节点
*
* @param array $data 数据列表
* @param int $id 当前节点ID
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @return array
*/
public static function getParents(array $data, int $id, string $pidField = 'parent_id', string $idField = 'id'): array
{
$parents = [];
foreach ($data as $item) {
if ($item[$idField] == $id) {
if ($item[$pidField] != 0) {
$parents[] = $item;
$parentParents = static::getParents($data, $item[$pidField], $pidField, $idField);
$parents = array_merge($parents, $parentParents);
} }
break; $item['meta']['authList'] = $authList;
}
}
return $parents;
}
/**
* 获取指定节点的子孙节点ID列表
*
* @param array $data 数据列表
* @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @return array
*/
public static function getChildrenIds(array $data, int $parentId, string $pidField = 'parent_id', string $idField = 'id'): array
{
$ids = [];
$children = static::findChildren($data, $parentId, $pidField, $idField);
foreach ($children as $child) {
$ids[] = $child[$idField];
}
return $ids;
}
/**
* 检查是否有子节点
*
* @param array $data 数据列表
* @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @return bool
*/
public static function hasChildren(array $data, int $parentId, string $pidField = 'parent_id'): bool
{
foreach ($data as $item) {
if ($item[$pidField] == $parentId) {
return true;
}
}
return false;
}
/**
* 构建带有权限列表的资源树(权限不显示在树结构中)
*
* @param array $data 资源数据列表
* @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @param string $typeField 类型字段名
* @param string $permissionType 权限类型标识
* @param int $level 当前层级
* @return array
*/
public static function buildWithAuthList(
array $data,
int $parentId = 0,
string $pidField = 'parent_id',
string $idField = 'id',
string $typeField = 'type',
string $permissionType = 'permission',
int $level = 0
): array {
$tree = [];
foreach ($data as $item) {
// 只处理指定父级的非权限节点
if ($item[$pidField] == $parentId && $item[$typeField] != $permissionType) {
$item['level'] = $level;
// 递归处理子节点(非权限类型)
$children = static::buildWithAuthList($data, $item[$idField], $pidField, $idField, $typeField, $permissionType, $level + 1);
if (!empty($children)) {
$item['children'] = $children;
}
// 收集当前节点下的所有权限
$item['auth_list'] = static::collectDirectPermissions($data, $item[$idField], $pidField, $typeField, $permissionType);
$tree[] = $item;
} }
} }
@@ -241,23 +461,15 @@ class Tree
* *
* @param array $data 数据列表 * @param array $data 数据列表
* @param int $parentId 父级ID * @param int $parentId 父级ID
* @param string $pidField 父级字段名
* @param string $typeField 类型字段名
* @param string $permissionType 权限类型标识
* @return array * @return array
*/ */
public static function collectDirectPermissions( public static function collectDirectPermissions(array $data, int $parentId): array
array $data, {
int $parentId,
string $pidField = 'parent_id',
string $typeField = 'type',
string $permissionType = 'permission'
): array {
$permissions = []; $permissions = [];
foreach ($data as $item) { foreach ($data as $item) {
// 收集直接子节点中的权限类型 // 收集直接子节点中的权限类型
if ($item[$pidField] == $parentId && $item[$typeField] == $permissionType) { if ($item['parent_id'] == $parentId && ($item['type'] ?? '') == 'permission') {
$permissions[] = $item; $permissions[] = $item;
} }
} }
@@ -266,55 +478,28 @@ class Tree
} }
/** /**
* 使用引用方式构建带有权限列表的资源树(权限不显示在树结构中) * 获取需要放入meta的额外字段
* *
* @param array $data 资源数据列表 * @param array $item 菜单项
* @param string $pidField 父级字段名
* @param string $idField ID字段名
* @param string $typeField 类型字段名
* @param string $permissionType 权限类型标识
* @return array * @return array
*/ */
public static function buildWithAuthListAndReference( public static function getExtraFields(array $item): array
array $data, {
string $pidField = 'parent_id', $extraFields = [];
string $idField = 'id', $standardFields = [
string $typeField = 'type', 'id', 'name', 'url', 'icon', 'parent_id', 'type', 'is_hide',
string $permissionType = 'permission' 'is_hide_tab', 'keep_alive', 'code', 'level'
): array { ];
$items = [];
$tree = [];
// 建立以id为索引的数组(只包含非权限节点) foreach ($item as $key => $value) {
foreach ($data as $item) { // 如果不是标准字段且不是auth_list,则放入extraFields
if ($item[$typeField] != $permissionType) { if (!in_array($key, $standardFields) && $key !== 'auth_list') {
$item['level'] = 0; // 转换下划线命名到驼峰命名
$items[$item[$idField]] = $item; $camelKey = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $key))));
$extraFields[$camelKey] = $value;
} }
} }
// 构建树形结构 return $extraFields;
foreach ($items as $id => $item) {
if ($item[$pidField] == 0) {
$tree[] = &$items[$id];
} else {
if (isset($items[$item[$pidField]])) {
$items[$id]['level'] = $items[$item[$pidField]]['level'] + 1;
if (!isset($items[$item[$pidField]]['children'])) {
$items[$item[$pidField]]['children'] = [];
}
$items[$item[$pidField]]['children'][] = &$items[$id];
}
}
}
// 为每个节点添加权限列表
foreach ($items as &$item) {
$item['auth_list'] = static::collectDirectPermissions($data, $item[$idField], $pidField, $typeField, $permissionType);
}
return $tree;
} }
} }
@@ -0,0 +1,102 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>邮箱提醒</title>
<style type="text/css">
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333333;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
}
.header {
padding: 20px;
background-color: #0056b3;
color: white;
text-align: center;
}
.content {
padding: 20px;
}
.button {
display: inline-block;
padding: 10px 20px;
background-color: #0056b3;
color: white !important;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
margin: 10px 0;
}
.footer {
padding: 15px;
text-align: center;
font-size: 12px;
color: #777777;
background-color: #f0f0f0;
}
@media only screen and (max-width: 480px) {
.email-container {
width: 100%;
}
.button {
display: block;
text-align: center;
}
}
</style>
</head>
<body>
<!--[if mso]>
<style type="text/css">
.button {
background-color: #0056b3 !important;
color: white !important;
}
</style>
<![endif]-->
<table class="email-container" width="100%" cellspacing="0" cellpadding="0" border="0" align="center">
<tr>
<td class="header">
<h1>工单提醒</h1>
</td>
</tr>
<tr>
<td class="content">
<p>你好,</p>
<p>你有新的工单待处理。请及时查看:</p>
<ul>
<li>工单编号:{{code}}</li>
<li>工单分类:{{category}}</li>
<li>问题描述:{{content}}</li>
</ul>
<p>请点击下方按钮立即查看详情:</p>
<div style="text-align: center;">
<a href="https://x.hnxinyouhe.com" class="button" style="color: white; text-decoration: none;">立即查看</a>
</div>
<!--<p>如果您未请求此操作,请忽略此邮件或联系我们的客服团队。</p>-->
</td>
</tr>
<tr>
<td class="footer">
<p>© 2025 河南新友合科技有限公司. 保留所有权利。</p>
<p>这是系统自动发送的邮件,请勿直接回复。</p>
</td>
</tr>
</table>
</body>
</html>
+7 -7
View File
@@ -106,13 +106,13 @@ class IndexController
public function test() public function test()
{ {
$uidRotator = new \app\common\utils\RedisUidRotator('email_parsed_result_20250804'); $data = [
$uidRotator->setUids([64, 63, 83, 93, 108, 118, 131, 132, 145, 150, 143, 156, 157, 158]); 'code' => 'GD20250703-1DC80',
'category' => '账号类问题',
'content' => '这是一条测试工单内容。'
];
\app\common\utils\email\MailSend::send('mzl@hnxinyouhe.com', '【XYH】新的工单提醒', replaceTpl($data, 'work_order'));
$assignedUid = $uidRotator->next(); return 22;
flg($assignedUid, false);
return $assignedUid;
} }
} }
+17 -2
View File
@@ -158,9 +158,10 @@ if (!function_exists('sendFeishuTextMessage')) {
* 替换模板 * 替换模板
*/ */
if (!function_exists('replaceTpl')) { if (!function_exists('replaceTpl')) {
function replaceTpl(array $data = [], string $templatePath = 'common/utils/scaffold/templates/Email.stub') function replaceTpl(array $data = [], string $tplKey = 'email')
{ {
if (!$data || !$templatePath) return ''; if (!$data || !$tplKey) return '';
$templatePath = tplUrl($tplKey);
$templatePath = app_path($templatePath); $templatePath = app_path($templatePath);
$content = file_get_contents($templatePath); $content = file_get_contents($templatePath);
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
@@ -170,6 +171,20 @@ if (!function_exists('replaceTpl')) {
} }
} }
/**
* 模板路径
*/
if (!function_exists('tplUrl')) {
function tplUrl(string $tplKey = '')
{
$urlArray = [
'email' => 'common/utils/scaffold/templates/Email.stub',
'work_order' => 'common/utils/scaffold/templates/workOrder.stub'
];
return $urlArray[$tplKey];
}
}
/** /**
* 替换模板 * 替换模板
*/ */