143 lines
4.4 KiB
C#
143 lines
4.4 KiB
C#
using System.ComponentModel;
|
|
using System.Reflection;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using NewLife.Reflection;
|
|
using NewLife.Web;
|
|
using XCode;
|
|
using XCode.Membership;
|
|
|
|
namespace NewLife.Cube;
|
|
|
|
/// <summary>实体树控制器基类</summary>
|
|
/// <typeparam name="TEntity"></typeparam>
|
|
public class EntityTreeController<TEntity> : EntityTreeController<TEntity, TEntity> where TEntity : EntityTree<TEntity>, new() { }
|
|
|
|
/// <summary>实体树控制器基类</summary>
|
|
/// <typeparam name="TEntity"></typeparam>
|
|
/// <typeparam name="TModel">数据模型,用于接口数据传输</typeparam>
|
|
public class EntityTreeController<TEntity, TModel> : EntityController<TEntity, TModel> where TEntity : EntityTree<TEntity>, new()
|
|
{
|
|
static EntityTreeController()
|
|
{
|
|
var type = typeof(TEntity);
|
|
var all = Entity<TEntity>.Meta.AllFields;
|
|
//var list = new List<FieldItem>();
|
|
var list = ListFields;
|
|
var set = type.GetValue("Setting") as IEntityTreeSetting;
|
|
var k = 0;
|
|
var names = new String[] { set.Key, "TreeNodeName" };
|
|
foreach (var item in names)
|
|
{
|
|
var fi = all.FirstOrDefault(e => e.Name.EqualIgnoreCase(item));
|
|
if (fi != null)
|
|
{
|
|
list.RemoveField(item);
|
|
list.Insert(k++, list.Create(fi));
|
|
}
|
|
}
|
|
|
|
foreach (var item in all)
|
|
{
|
|
if (set != null && item.Name.EqualIgnoreCase(set.Name, set.Parent))
|
|
{
|
|
list.RemoveField(item.Name);
|
|
continue;
|
|
}
|
|
|
|
var pi = type.GetProperty(item.Name);
|
|
if (pi == null || pi.GetCustomAttribute<DisplayNameAttribute>() == null)
|
|
{
|
|
list.RemoveField(item.Name);
|
|
continue;
|
|
}
|
|
|
|
//if (!list.Contains(item)) list.Insert(k++, item);
|
|
}
|
|
|
|
//ListFields.Clear();
|
|
//ListFields.AddRange(list);
|
|
}
|
|
|
|
/// <summary>实体树配置</summary>
|
|
/// <returns></returns>
|
|
protected IEntityTreeSetting GetSetting()
|
|
{
|
|
//var set = EntityTree<TEntity>.Setting;
|
|
var set = typeof(EntityTree<TEntity>).GetValue("Setting") as IEntityTreeSetting;
|
|
return set;
|
|
}
|
|
|
|
/// <summary>实体树的数据来自缓存</summary>
|
|
/// <param name="p"></param>
|
|
/// <returns></returns>
|
|
protected override IEnumerable<TEntity> Search(Pager p)
|
|
{
|
|
// 一页显示全部菜单,取自缓存
|
|
p.PageSize = 10000;
|
|
|
|
var set = GetSetting();
|
|
if (set != null && !set.Parent.IsNullOrEmpty())
|
|
{
|
|
var pkey = p[set.Parent].ToInt(-1);
|
|
if (pkey >= 0)
|
|
return EntityTree<TEntity>.FindAllChildsByParent(pkey);
|
|
}
|
|
|
|
return EntityTree<TEntity>.Root.AllChilds;
|
|
}
|
|
|
|
///// <summary>要导出Xml的对象</summary>
|
|
///// <returns></returns>
|
|
//protected override Object OnExportXml()
|
|
//{
|
|
// return EntityTree<TEntity>.Root.Childs;
|
|
//}
|
|
|
|
///// <summary>要导出Json的对象</summary>
|
|
///// <returns></returns>
|
|
//protected override Object OnExportJson()
|
|
//{
|
|
// return EntityTree<TEntity>.Root.Childs;
|
|
//}
|
|
|
|
/// <summary>上升</summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[DisplayName("上升")]
|
|
[EntityAuthorize(PermissionFlags.Update)]
|
|
[HttpPatch]
|
|
public ActionResult Up(Int32 id)
|
|
{
|
|
var menu = FindByID(id);
|
|
|
|
if (Valid(menu, DataObjectMethodType.Update, true))
|
|
menu.Up();
|
|
|
|
return RedirectToAction("Index");
|
|
}
|
|
|
|
/// <summary>下降</summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[DisplayName("下降")]
|
|
[EntityAuthorize(PermissionFlags.Update)]
|
|
[HttpPatch]
|
|
public ActionResult Down(Int32 id)
|
|
{
|
|
var menu = FindByID(id);
|
|
|
|
if (Valid(menu, DataObjectMethodType.Update, true))
|
|
menu.Down();
|
|
|
|
return RedirectToAction("Index");
|
|
}
|
|
|
|
/// <summary>根据ID查找节点</summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
protected static TEntity FindByID(Int32 id)
|
|
{
|
|
var key = EntityTree<TEntity>.Meta.Unique.Name;
|
|
return EntityTree<TEntity>.Meta.Cache.Find(e => (Int32)e[key] == id);
|
|
}
|
|
} |