diff --git a/CodeSmith/Add.cshtml.cst b/CodeSmith/Add.cshtml.cst
new file mode 100644
index 00000000..2cf8b971
--- /dev/null
+++ b/CodeSmith/Add.cshtml.cst
@@ -0,0 +1,148 @@
+<%--
+Name: Database Table Properties
+Author: Paul Welter
+Description: Create a list of properties from a database table
+--%>
+<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="False" Encoding="utf-8" Description="添加模块" %>
+<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context"
+Description="连接的数据库" %>
+<%@ Property Name="ModuleName" Type="String" Category="Context" Description="模块名称" %>
+<%@ Property Name="NeedViewModel" Type="Boolean" Category="Context" Default="False" Description="是否需要ViewModel" %>
+<%@ Property Name="CascadeId" Type="String" Category="" Default="ParentId" Description="级联字段" %>
+<%@ Property Name="CascadeName" Type="String" Category="" Default="ParentName" Description="级联显示的文字" %>
+<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
+<%@ Assembly Name="SchemaExplorer" %>
+<%@ Import Namespace="SchemaExplorer" %>
+
+<%if(NeedViewModel){ %>
+@model OpenAuth.App.ViewModel.<%=GetModelName()%>
+<%} else{ %>
+@model OpenAuth.Domain.<%=GetModelName()%>
+<%} %>
+@{
+ ViewBag.Title = "<%=GetModelName()%>编辑界面";
+ Layout = null;
+}
+
+
+
+
+
\ No newline at end of file
diff --git a/CodeSmith/Application.cst b/CodeSmith/Application.cst
new file mode 100644
index 00000000..7d3e6d7a
--- /dev/null
+++ b/CodeSmith/Application.cst
@@ -0,0 +1,131 @@
+<%--
+Name: Database Table Properties
+Author: Paul Welter
+Description: Create a list of properties from a database table
+--%>
+<%@ CodeTemplate Language="C#" Encoding="utf-8" TargetLanguage="C#" Debug="False" Description="应用层" %>
+<%@ Property Name="ModuleName" Type="String" Category="Context" Description="模块名称" %>
+<%@ Property Name="NeedViewModel" Type="Boolean" Category="Context" Default="False" Description="是否需要ViewModel" %>
+<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
+<%@ Assembly Name="SchemaExplorer" %>
+<%@ Import Namespace="SchemaExplorer" %>
+
+
+<%if(NeedViewModel){ %>
+using OpenAuth.App.ViewModel;
+<%} %>
+using OpenAuth.Domain;
+using OpenAuth.Domain.Interface;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace OpenAuth.App
+{
+ public class <%=ModuleName%>ManagerApp
+ {
+ private I<%=ModuleName%>Repository _repository;
+ private IOrgRepository _orgRepository;
+
+ public <%=ModuleName%>ManagerApp(I<%=ModuleName%>Repository repository,
+ IOrgRepository orgRepository)
+ {
+ _repository = repository;
+ _orgRepository = orgRepository;
+ }
+
+ public int Get<%=GetModelName()%>CntInOrg(int orgId)
+ {
+ if (orgId == 0)
+ {
+ return _repository.Find(null).Count();
+ }
+ else
+ {
+ return _repository.Get<%=GetModelName()%>CntInOrgs(GetSubOrgIds(orgId));
+ }
+ }
+
+ ///
+ /// 加载一个部门及子部门全部<%=GetModelName()%>s
+ ///
+ public dynamic Load(int orgId, int pageindex, int pagesize)
+ {
+ IEnumerable<<%=ModuleName%>> <%=ModuleName%>s;
+ int total = 0;
+ if (orgId == 0)
+ {
+ <%=ModuleName%>s = _repository.Load<%=ModuleName%>s(pageindex, pagesize);
+ total = _repository.GetCount();
+ }
+ else
+ {
+ <%=ModuleName%>s = _repository.LoadInOrgs(pageindex, pagesize,GetSubOrgIds(orgId));
+ total = _repository.Get<%=ModuleName%>CntInOrgs(orgId);
+ }
+ <%if(NeedViewModel){ %>
+ var <%=ModuleName%>views = new List<<%=ModuleName%>View>();
+ foreach (var <%=ModuleName%> in <%=ModuleName%>s)
+ {
+ <%=ModuleName%>View uv = <%=ModuleName%>;
+ uv.Organizations = string.Join(",", _orgRepository.LoadBy<%=ModuleName%>(<%=ModuleName%>.Id).Select(u => u.Name).ToList());
+ <%=ModuleName%>views.Add(uv);
+ }
+ <%} %>
+
+ return new
+ {
+ total = total,
+ list = <%=GetModelName()%>s,
+ pageCurrent = pageindex
+ };
+ }
+
+ ///
+ /// 获取当前组织的所有下级组织
+ ///
+ private int[] GetSubOrgIds(int orgId)
+ {
+ 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;
+ }
+
+ public <%=GetModelName()%> Find(int id)
+ {
+ var <%=ModuleName.ToLower()%> = _repository.FindSingle(u => u.Id == id);
+ if (<%=ModuleName.ToLower()%> == null) return new <%=GetModelName()%>();
+
+ return <%=ModuleName.ToLower() %>;
+ }
+
+ public void Delete(int id)
+ {
+ _repository.Delete(id);
+ }
+
+ public void AddOrUpdate(<%=GetModelName()%> model)
+ {
+ <%=ModuleName%> <%=ModuleName.ToLower()%> = model;
+ if (<%=ModuleName.ToLower()%>.Id == 0)
+ {
+ _repository.Add(<%=ModuleName.ToLower()%>);
+ }
+ else
+ {
+ _repository.Update(<%=ModuleName.ToLower()%>);
+ }
+
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/CodeSmith/Controller.cst b/CodeSmith/Controller.cst
new file mode 100644
index 00000000..9b88dd88
--- /dev/null
+++ b/CodeSmith/Controller.cst
@@ -0,0 +1,102 @@
+<%--
+Name: Database Table Properties
+Author: Paul Welter
+Description: Create a list of properties from a database table
+--%>
+<%@ CodeTemplate Language="C#" Encoding="utf-8" TargetLanguage="C#" Debug="False" Description="控制器" %>
+<%@ Property Name="ModuleName" Type="String" Category="Context" Description="模块名称" %>
+<%@ Property Name="NeedViewModel" Type="Boolean" Category="Context" Default="False" Description="是否需要ViewModel" %>
+<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
+<%@ Assembly Name="SchemaExplorer" %>
+<%@ Import Namespace="SchemaExplorer" %>
+
+
+using System;
+using System.Web.Mvc;
+using Infrastructure;
+using OpenAuth.App;
+<%if(NeedViewModel){ %>
+using OpenAuth.App.ViewModel;
+<%} %>
+
+namespace OpenAuth.Mvc.Controllers
+{
+ public class <%=ModuleName%>ManagerController : BaseController
+ {
+ private <%=ModuleName%>ManagerApp _app;
+
+ public <%=ModuleName%>ManagerController()
+ {
+ _app = (<%=ModuleName%>ManagerApp)DependencyResolver.Current.GetService(typeof(<%=ModuleName%>ManagerApp));
+ }
+
+ //
+ // GET: /<%=ModuleName%>Manager/
+ public ActionResult Index()
+ {
+ return View();
+ }
+
+ public ActionResult Add(int id = 0)
+ {
+ return View(_app.Find(id));
+ }
+
+ //添加或修改组织
+ [HttpPost]
+ public string Add(<%=GetModelName()%> model)
+ {
+ try
+ {
+ _app.AddOrUpdate(model);
+
+ }
+ catch (Exception ex)
+ {
+ BjuiResponse.statusCode = "300";
+ BjuiResponse.message = ex.Message;
+ }
+ return JsonHelper.Instance.Serialize(BjuiResponse);
+ }
+
+ ///
+ /// 加载组织下面的所有用户
+ ///
+ public string Load(int orgId, int pageCurrent = 1, int pageSize = 30)
+ {
+ return JsonHelper.Instance.Serialize(_app.Load(orgId, pageCurrent, pageSize));
+ }
+
+ //获取组织下面用户个数
+ public int GetCount(int orgId)
+ {
+ return _app.Get<%=GetModelName()%>CntInOrg(orgId);
+ }
+
+ public string Delete(string Id)
+ {
+ try
+ {
+ foreach (var obj in Id.Split(','))
+ {
+ _app.Delete(int.Parse(obj));
+ }
+ }
+ catch (Exception e)
+ {
+ BjuiResponse.statusCode = "300";
+ BjuiResponse.message = e.Message;
+ }
+
+ return JsonHelper.Instance.Serialize(BjuiResponse);
+ }
+ }
+}
\ No newline at end of file
diff --git a/CodeSmith/IRepository.cst b/CodeSmith/IRepository.cst
new file mode 100644
index 00000000..4e1ec96c
--- /dev/null
+++ b/CodeSmith/IRepository.cst
@@ -0,0 +1,28 @@
+<%--
+Name: Database Table Properties
+Author: Paul Welter
+Description: Create a list of properties from a database table
+--%>
+<%@ CodeTemplate Language="C#" Encoding="utf-8" TargetLanguage="C#" Debug="False" Description="创建包含组织机构的接口" %>
+<%@ Property Name="ModuleName" Type="String" Category="Context" Description="模块名称" %>
+<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
+<%@ Assembly Name="SchemaExplorer" %>
+<%@ Import Namespace="SchemaExplorer" %>
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace OpenAuth.Domain.Interface
+{
+ public interface I<%=ModuleName%>Repository :IRepository<<%=ModuleName%>>
+ {
+ IEnumerable<<%=ModuleName%>> Load<%=ModuleName%>s(int pageindex, int pagesize);
+
+ IEnumerable<<%=ModuleName%>> LoadInOrgs(params int[] orgId);
+ int Get<%=ModuleName%>CntInOrgs(params int[] orgIds);
+ IEnumerable<<%=ModuleName%>> LoadInOrgs(int pageindex, int pagesize, params int[] orgIds);
+
+ void Delete(int id);
+
+ }
+}
\ No newline at end of file
diff --git a/CodeSmith/Index.cshtml.cst b/CodeSmith/Index.cshtml.cst
new file mode 100644
index 00000000..5396b131
--- /dev/null
+++ b/CodeSmith/Index.cshtml.cst
@@ -0,0 +1,170 @@
+<%--
+Name: Database Table Properties
+Author: Paul Welter
+Description: Create a list of properties from a database table
+--%>
+<%@ CodeTemplate Language="C#" Encoding="utf-8" TargetLanguage="C#" Debug="True" Description="Create a list of properties from database table." %>
+<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
+<%@ Property Name="ModuleName" Type="String" Category="Context" Description="模块名称" %>
+<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
+<%@ Assembly Name="SchemaExplorer" %>
+<%@ Import Namespace="SchemaExplorer" %>
+
+@{
+ string _prefix = "<%=ModuleName%>";
+ var _treeId = _prefix + "Tree";
+ var _gridId = _prefix + "Grid";
+ var _treeDetail = _prefix + "Detail";
+}
+
+
+
+
diff --git a/CodeSmith/proj/cshtml.csp b/CodeSmith/proj/cshtml.csp
new file mode 100644
index 00000000..50829c3d
--- /dev/null
+++ b/CodeSmith/proj/cshtml.csp
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+ $(ConnectionString1)
+ SchemaExplorer.SqlSchemaProvider,SchemaExplorer.SqlSchemaProvider
+
+
+ Module
+
+
+
+ $(ConnectionString1)
+ SchemaExplorer.SqlSchemaProvider,SchemaExplorer.SqlSchemaProvider
+
+
+ Role
+
+
+
\ No newline at end of file