diff --git a/OpenAuth.App/ModuleManagerApp.cs b/OpenAuth.App/ModuleManagerApp.cs index b300773d..cf535e96 100644 --- a/OpenAuth.App/ModuleManagerApp.cs +++ b/OpenAuth.App/ModuleManagerApp.cs @@ -10,13 +10,10 @@ namespace OpenAuth.App public class ModuleManagerApp { private IModuleRepository _repository; - private IOrgRepository _orgRepository; - public ModuleManagerApp(IModuleRepository repository, - IOrgRepository orgRepository) + public ModuleManagerApp(IModuleRepository repository) { _repository = repository; - _orgRepository = orgRepository; } public int GetModuleCntInOrg(int orgId) @@ -57,16 +54,15 @@ namespace OpenAuth.App }; } - /// - /// 获取当前组织的所有下级组织 - /// - private int[] GetSubOrgIds(int orgId) + public List LoadForTree(bool bAll) { - var org = _orgRepository.FindSingle(u => u.Id == orgId); - var orgs = _orgRepository.Find(u => u.CascadeId.Contains(org.CascadeId)).Select(u => u.Id).ToArray(); - return orgs; + if (bAll) + return _repository.Find(null).ToList(); + return _repository.Find(u => u.ParentId == 0).ToList(); } + + public Module Find(int id) { var module = _repository.FindSingle(u => u.Id == id); @@ -77,7 +73,10 @@ namespace OpenAuth.App public void Delete(int id) { - _repository.Delete(id); + var del = _repository.FindSingle(u => u.Id == id); + if (del == null) return; + + _repository.Delete(u => u.CascadeId.Contains(del.CascadeId)); } public void AddOrUpdate(Module model) @@ -85,6 +84,29 @@ namespace OpenAuth.App Module module = model; if (module.Id == 0) { + string cascadeId; + int currentCascadeId = GetMaxCascadeId(module.ParentId); + + if (module.ParentId != 0) + { + var parentOrg = _repository.FindSingle(o => o.Id == module.ParentId); + if (parentOrg != null) + { + cascadeId = parentOrg.CascadeId + "." + currentCascadeId; + module.ParentName = parentOrg.Name; + } + else + { + throw new Exception("未能找到该组织的父节点信息"); + } + } + else + { + cascadeId = "0." + currentCascadeId; + module.ParentName = ""; + } + + module.CascadeId = cascadeId; _repository.Add(module); } else @@ -94,6 +116,31 @@ namespace OpenAuth.App } + #region 私有方法 + + //根据同一级中最大的语义ID + private int GetMaxCascadeId(int parentId) + { + int currentCascadeId = 1; + var sameLevels = _repository.Find(o => o.ParentId == parentId); + foreach (var obj in sameLevels) + { + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId < objCascadeId) currentCascadeId = objCascadeId + 1; + } + + return currentCascadeId; + } + + private int[] GetSubOrgIds(int orgId) + { + var org = _repository.FindSingle(u => u.Id == orgId); + var orgs = _repository.Find(u => u.CascadeId.Contains(org.CascadeId)).Select(u => u.Id).ToArray(); + return orgs; + } + + #endregion 私有方法 + } } \ No newline at end of file diff --git a/OpenAuth.App/OrgManagerApp.cs b/OpenAuth.App/OrgManagerApp.cs index c76d59fa..89a5d462 100644 --- a/OpenAuth.App/OrgManagerApp.cs +++ b/OpenAuth.App/OrgManagerApp.cs @@ -109,13 +109,13 @@ namespace OpenAuth.App { int currentCascadeId = 1; - var maxCascadeIdOrg = _repository.Find(o => o.ParentId == parentId) - .OrderByDescending(o => o.CascadeId).FirstOrDefault(); - if (maxCascadeIdOrg != null) + var sameLevels = _repository.Find(o => o.ParentId == parentId); + foreach (var obj in sameLevels) { - var cascades = maxCascadeIdOrg.CascadeId.Split('.'); - currentCascadeId = int.Parse(cascades[cascades.Length - 1]) + 1; + int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last()); + if (currentCascadeId < objCascadeId) currentCascadeId = objCascadeId + 1; } + return currentCascadeId; } diff --git a/OpenAuth.Mvc/Controllers/ModuleManagerController.cs b/OpenAuth.Mvc/Controllers/ModuleManagerController.cs index 827d89cc..01562f7e 100644 --- a/OpenAuth.Mvc/Controllers/ModuleManagerController.cs +++ b/OpenAuth.Mvc/Controllers/ModuleManagerController.cs @@ -28,7 +28,7 @@ namespace OpenAuth.Mvc.Controllers return View(_app.Find(id)); } - //添加或修改组织 + //添加或修改模块 [HttpPost] public string Add(Module model) { @@ -46,14 +46,31 @@ namespace OpenAuth.Mvc.Controllers } /// - /// 加载组织下面的所有用户 + /// 加载模块下面的所有模块 /// public string Load(int orgId, int pageCurrent = 1, int pageSize = 30) { return JsonHelper.Instance.Serialize(_app.Load(orgId, pageCurrent, pageSize)); } - //获取组织下面用户个数 + /// + /// 加载tree结构 + /// + public string LoadForTree(bool bAll=false) + { + var orgs = _app.LoadForTree(bAll); + //添加根节点 + orgs.Add(new Module + { + Id = 0, + ParentId = -1, + Name = "全部模块", + CascadeId = "0" + }); + return JsonHelper.Instance.Serialize(orgs); + } + + //获取模块下面模块个数 public int GetCount(int orgId) { return _app.GetModuleCntInOrg(orgId); diff --git a/OpenAuth.Mvc/Views/ModuleManager/Add.cshtml b/OpenAuth.Mvc/Views/ModuleManager/Add.cshtml index 9337797a..bf78d25b 100644 --- a/OpenAuth.Mvc/Views/ModuleManager/Add.cshtml +++ b/OpenAuth.Mvc/Views/ModuleManager/Add.cshtml @@ -14,121 +14,61 @@ @Html.HiddenFor(m => m.Id) - - - - 节点语义ID: - + @Html.HiddenFor(m =>m.CascadeId) - - 功能模块名称: + 功能模块名称: - - 主页面URL: + 主页面URL: - - 热键: - + 上级功能模块: + + + + - - - - 父节点流水号: - - - selected="selected" }>默认 - selected="selected" }>状态1 - - - - - - - - - 是否叶子节点: - - - selected="selected" }>否 - selected="selected" }>是 - - - - - - - - - 是否自动展开: - - - selected="selected" }>否 - selected="selected" }>是 - - - - - - - 节点图标文件名称: + 节点图标文件名称: - - - - 当前状态: - + 当前状态: selected="selected" }>默认 selected="selected" }>状态1 + - - 父节点名称: - - - - - - - 矢量图标: + 矢量图标: - - - - 排序号: - + 排序号: selected="selected" }>默认 selected="selected" }>状态1 @@ -157,8 +97,8 @@ }, check: { enable: true, - chkStyle: "checkbox", - chkboxType: { "Y": "", "N": "" } //去掉勾选时级联 + chkStyle: "radio", + radioType: "all" }, data: { key: { @@ -177,7 +117,7 @@ onCheck: zTreeCheck } }; - $.getJSON('OrgManager/LoadOrg', function (json) { + $.getJSON('ModuleManager/LoadForTree?bAll=true', function (json) { var zTreeObj = $.fn.zTree.init($('#j_select_tree1'), setting, json); zTreeObj.expandAll(true); }); @@ -199,7 +139,7 @@ var $from = $('#' + treeId).data('fromObj'); if ($from && $from.length) $from.val(names); - $('#OrganizationIds').val(ids); + $('#ParentId').val(ids); } function zTreeOnClick(event, treeId, treeNode) { var zTree = $.fn.zTree.getZTreeObj(treeId); diff --git a/OpenAuth.Mvc/Views/ModuleManager/Index.cshtml b/OpenAuth.Mvc/Views/ModuleManager/Index.cshtml index 9b355137..f5a72b24 100644 --- a/OpenAuth.Mvc/Views/ModuleManager/Index.cshtml +++ b/OpenAuth.Mvc/Views/ModuleManager/Index.cshtml @@ -92,7 +92,7 @@ }, ], dataUrl: 'ModuleManager/Load?orgId=' + selectedId, - delUrl: 'Module/Delete', + delUrl: 'ModuleManager/Delete', delPK: "Id", fullGrid: true, showLinenumber: true, @@ -133,7 +133,7 @@ }, callback: {onClick: zTreeOnClick} }; - $.getJSON('OrgManager/LoadOrg', function (json) { + $.getJSON('ModuleManager/LoadForTree', function (json) { var zTreeObj = $.fn.zTree.init($('#@_treeId'), setting, json); zTreeObj.expandAll(true); }); diff --git a/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj b/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj index 346beb50..3b60a082 100644 --- a/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj +++ b/OpenAuth.UnitTest/OpenAuth.UnitTest.csproj @@ -66,6 +66,7 @@ + diff --git a/OpenAuth.UnitTest/TestModuleApp.cs b/OpenAuth.UnitTest/TestModuleApp.cs new file mode 100644 index 00000000..6701b411 --- /dev/null +++ b/OpenAuth.UnitTest/TestModuleApp.cs @@ -0,0 +1,96 @@ +using System; +using System.Text; +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenAuth.App; +using OpenAuth.Domain; +using OpenAuth.Repository; + +namespace OpenAuth.UnitTest +{ + /// + /// TestModuleApp 的摘要说明 + /// + [TestClass] + public class TestModuleApp + { + + + private TestContext testContextInstance; + private ModuleManagerApp _app = new ModuleManagerApp(new ModuleRepository()); + private string _time = DateTime.Now.ToString("HH_mm_ss_ms"); + /// + ///获取或设置测试上下文,该上下文提供 + ///有关当前测试运行及其功能的信息。 + /// + public TestContext TestContext + { + get + { + return testContextInstance; + } + set + { + testContextInstance = value; + } + } + + #region 附加测试特性 + // + // 编写测试时,可以使用以下附加特性: + // + // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码 + // [ClassInitialize()] + // public static void MyClassInitialize(TestContext testContext) { } + // + // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码 + // [ClassCleanup()] + // public static void MyClassCleanup() { } + // + // 在运行每个测试之前,使用 TestInitialize 来运行代码 + // [TestInitialize()] + // public void MyTestInitialize() { } + // + // 在每个测试运行完之后,使用 TestCleanup 来运行代码 + // [TestCleanup()] + // public void MyTestCleanup() { } + // + #endregion + + [TestMethod] + public void TestAddModule() + { + var root = Add(); + for (int i = 0; i < 30; i++) + { + Add(root.Id); + } + } + + [TestMethod] + public void TestDelModule() + { + var root = Add(0); + _app.Delete(root.Id); + } + + + + [TestMethod] + public void TestEdit() + { + + } + + public Module Add(int parent = 0) + { + var module = new Module() + { + Name = "test_" + _time, + ParentId = parent + }; + _app.AddOrUpdate(module); + return module; + } + } +}