/// <summary> /// 生成所有屏幕名称数据 /// </summary> /// <param name="compile">编译对象</param> /// <param name="jsonWriter">JsonWriter</param> private void BuildAllScreens(CompileBase compile, JsonWriter jsonWriter) { string retrunValue = string.Empty; DojoCompile dojoCompile = (DojoCompile)compile; Dictionary <int, int> screenPermissionData = dojoCompile.ScreenPermissionData; var screenItems = dojoCompile.ProjectItems.Where(a => a.Value.DocumentType == GlobalIds.DocumentType.Screen).ToList(); foreach (var item in screenItems) { var doc = item.Value as ProjectDocument; if (doc != null) { jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("Id"); jsonWriter.WriteValue(doc.Id); jsonWriter.WritePropertyName("Name"); jsonWriter.WriteValue(doc.Name); jsonWriter.WritePropertyName("Title"); jsonWriter.WriteValue(doc.Title); if (screenPermissionData.ContainsKey(doc.Id)) { var permissionId = (from t in screenPermissionData where t.Key == doc.Id select t.Value).FirstOrDefault(); jsonWriter.WritePropertyName("PermissionId"); jsonWriter.WriteValue(permissionId); } jsonWriter.WriteEndObject(); } } }
/// <summary> /// 生成主键 /// </summary> /// <param name="def"></param> /// <param name="dojoCompile"></param> /// <param name="jsonWriter"></param> private void BuildPrimaryString(EntityDefinition def, DojoCompile dojoCompile, JsonWriter jsonWriter) { foreach (var primary in def.Members.OfType <PrimaryMember>()) { dynamic type = primary.Content; jsonWriter.WritePropertyName(primary.Name); jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("Title"); jsonWriter.WriteValue(primary.Title); jsonWriter.WritePropertyName("Type"); jsonWriter.WriteValue(BuildCommonMethod.GetTypeName(type.BaseType)); jsonWriter.WriteEndObject(); } }
/// <summary> /// 生成模型数据定义 /// </summary> /// <param name="compile">编译对象</param> /// <param name="jsonWriter">JsonWriter</param> private void BuildAllDefinition(CompileBase compile, JsonWriter jsonWriter) { DojoCompile dojoCompile = compile as DojoCompile; var entityItem = dojoCompile.ProjectItems.Where(a => a.Value.DocumentType == GlobalIds.DocumentType.Entity).ToList(); foreach (var item in entityItem) { //jsonWriter.WriteStartObject(); //1 jsonWriter.WritePropertyName(item.Value.Name); jsonWriter.WriteStartObject(); var def = dojoCompile.GetDocumentBody(item.Value) as EntityDefinition; #region 获取所有自定义外键 StringBuilder sbAllForeigns = new StringBuilder(); StringBuilder sbForeignKey = new StringBuilder(); BuildCommonMethod.GetAllRelationForeignContent(item.Value.Propertys, def, dojoCompile, sbForeignKey); if (sbForeignKey.ToString().Length > 0) { sbAllForeigns.Append(sbForeignKey.ToString()); } #endregion #region EntityID jsonWriter.WritePropertyName("entityId"); jsonWriter.WriteValue(item.Key); #endregion #region Primary jsonWriter.WritePropertyName("primaryKey"); jsonWriter.WriteStartObject(); BuildPrimaryContent(item.Value.Propertys, def, dojoCompile, jsonWriter); jsonWriter.WriteEndObject(); #endregion #region Fields jsonWriter.WritePropertyName("fields"); jsonWriter.WriteStartObject(); BuildItemsContent(item.Value.Propertys, def, dojoCompile, jsonWriter, sbAllForeigns.ToString()); jsonWriter.WriteEndObject(); #endregion jsonWriter.WriteEndObject(); //jsonWriter.WriteEndObject(); //1 } }
/// <summary> /// 生成 /// </summary> /// <param name="compile">DOJO编译器</param> /// <param name="doc">文档对象模型</param> public override void Build(CompileBase compile, ProjectDocument doc) { DojoCompile dojoCompile = (DojoCompile)compile; StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { JsonWriter jsonWriter = new JsonTextWriter(sw); jsonWriter.Formatting = Formatting.Indented; var frontConfig = dojoCompile.Project.Configures.OfType <FrontEndConfigure>().FirstOrDefault(); //创建配置对象 #region jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("ProjectId"); jsonWriter.WriteValue(compile.ProjectId); jsonWriter.WritePropertyName("Name"); jsonWriter.WriteValue(compile.Project.Identity); jsonWriter.WritePropertyName("Title"); jsonWriter.WriteValue(compile.Project.Root.Title); jsonWriter.WritePropertyName("Desc"); jsonWriter.WriteValue(compile.Project.Description); jsonWriter.WritePropertyName("Version"); jsonWriter.WriteValue("1.0.0"); jsonWriter.WritePropertyName("ServiceBaseUrl"); jsonWriter.WriteValue(frontConfig.ServerUrl); jsonWriter.WritePropertyName("AuthServiceBaseUrl"); jsonWriter.WriteValue(frontConfig.ServerUrl); jsonWriter.WritePropertyName("DefaultPage"); jsonWriter.WriteValue(frontConfig.StartupScreen == null ? "MainScreen" : frontConfig.StartupScreen); jsonWriter.WritePropertyName("LoginPage"); jsonWriter.WriteValue("Login"); jsonWriter.WritePropertyName("DefaultThemes"); jsonWriter.WriteValue(""); #endregion #region 生成报表配置节 var reportConfig = dojoCompile.Project.Configures.OfType <ReportServerConfigure>().FirstOrDefault(); if (reportConfig != null) { jsonWriter.WritePropertyName("ReportBaseUrl"); jsonWriter.WriteValue(reportConfig.Reports); jsonWriter.WritePropertyName("ReportServerBaseUrl"); jsonWriter.WriteValue(reportConfig.ReportServer); } #endregion #region 生成所有屏幕数据 jsonWriter.WritePropertyName("Screens"); jsonWriter.WriteStartArray(); this.BuildAllScreens(compile, jsonWriter); jsonWriter.WriteEndArray(); #endregion #region 生成模型数据定义 jsonWriter.WritePropertyName("Definition"); //jsonWriter.WriteStartArray(); //1 jsonWriter.WriteStartObject(); this.BuildAllDefinition(compile, jsonWriter); jsonWriter.WriteEndObject(); //jsonWriter.WriteEndArray(); //1 #endregion jsonWriter.WriteEndObject(); //获取JSON串 string output = sw.ToString(); jsonWriter.Close(); sw.Close(); //创建配置文件 var file = Path.Combine(((DojoCompile)compile).OutputPath, "Config.json"); if (File.Exists(file)) { File.Delete(file); } File.WriteAllText(file, output, System.Text.UTF8Encoding.UTF8); //全局生成 var cFile = Path.Combine(((DojoCompile)compile).OutputPath, "Common.js"); if (File.Exists(cFile)) { File.Delete(cFile); } string content = "define(function(){return {}});"; File.WriteAllText(cFile, content, System.Text.UTF8Encoding.UTF8); } }
/// <summary> /// 生成字段 /// </summary> /// <param name="def"></param> /// <param name="dojoCompile"></param> /// <param name="jsonWriter"></param> private void BuildFiledsString(EntityDefinition def, DojoCompile dojoCompile, JsonWriter jsonWriter, string AllForeigns) { foreach (var member in def.Members) { if (member.MemberType == EMemberType.Calculate || member.MemberType == EMemberType.Column || member.MemberType == EMemberType.Common) { var typeContent = (CommonDataType)member.Content; //时间戳格式不生成 if (typeContent.BaseType == Foundation.EDataBaseType.Timestamp) { continue; } //标识该字段是否是自定义外键 bool IsForeignKey = false; if (AllForeigns.Length > 0) { string[] foreigns = AllForeigns.Split(','); for (var i = 0; i < foreigns.Length; i++) { if (foreigns[i] == member.Name) { IsForeignKey = true; break; } } } jsonWriter.WritePropertyName(member.Name); jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("Title"); jsonWriter.WriteValue(member.Title); jsonWriter.WritePropertyName("Type"); jsonWriter.WriteValue(BuildCommonMethod.GetTypeName(typeContent.BaseType)); jsonWriter.WritePropertyName("DataType"); jsonWriter.WriteValue(typeContent.BaseType.ToString()); #region IsRequired if (member.MemberType == EMemberType.Calculate) { var memberBase = member as ColumnMember; jsonWriter.WritePropertyName("IsRequired"); jsonWriter.WriteValue(memberBase.IsRequired); } else if (member.MemberType == EMemberType.Column) { var memberBase = member as ColumnMember; jsonWriter.WritePropertyName("IsRequired"); jsonWriter.WriteValue(memberBase.IsRequired); } else if (member.MemberType == EMemberType.Common) { var memberBase = member as CommonMember; jsonWriter.WritePropertyName("IsRequired"); jsonWriter.WriteValue(memberBase.IsRequired); } #endregion if (IsForeignKey) { jsonWriter.WritePropertyName("IsForeignKey"); jsonWriter.WriteValue(IsForeignKey); } bool serverRefresh = false; if (member.MemberType == EMemberType.Column) { if ((member as ColumnMember).GenerateMode != EColumnGenerateMode.None) { serverRefresh = true; } } jsonWriter.WritePropertyName("ServerRefresh"); jsonWriter.WriteValue(serverRefresh); jsonWriter.WriteEndObject(); } else if (member.MemberType == EMemberType.Navigation) { var navigationMember = member as NavigationMember; string toEntity = (from t in dojoCompile.ProjectItems where t.Key == navigationMember.ToEntityId select t.Value).FirstOrDefault().Name; jsonWriter.WritePropertyName(navigationMember.Name); jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("Title"); jsonWriter.WriteValue(navigationMember.Title); jsonWriter.WritePropertyName("Type"); jsonWriter.WriteValue(navigationMember.ToCardinality == EMappingCardinality.Many ? "array" : "object"); jsonWriter.WritePropertyName("DataType"); jsonWriter.WriteValue(navigationMember.ToCardinality == EMappingCardinality.Many ? "array" : "object"); jsonWriter.WritePropertyName("ToName"); jsonWriter.WriteValue(navigationMember.ToName); jsonWriter.WritePropertyName("ToEntity"); jsonWriter.WriteValue(toEntity); bool isSingleRelation = false; if (string.IsNullOrEmpty(navigationMember.ToName)) { isSingleRelation = true; } jsonWriter.WritePropertyName("SingleRelation"); jsonWriter.WriteValue(isSingleRelation); if (navigationMember.ToCardinality != EMappingCardinality.Many) { string navPrimaryKey = BuildCommonMethod.GetNavPrimaryContent(def, dojoCompile, toEntity); string foreignKey = BuildCommonMethod.GetRealForeignKey(navigationMember, toEntity, navPrimaryKey); if (navigationMember.Cardinality == EMappingCardinality.One && navigationMember.ToCardinality == EMappingCardinality.One) { foreignKey = navPrimaryKey; } jsonWriter.WritePropertyName("RelationForeignKey"); jsonWriter.WriteStartArray(); jsonWriter.WriteValue("" + foreignKey + ""); jsonWriter.WriteEndArray(); } jsonWriter.WriteEndObject(); } } }
/// <summary> /// 生成字段 /// </summary> /// <param name="itemPropertys"></param> /// <param name="def"></param> /// <param name="dojoCompile"></param> /// <param name="jsonWriter"></param> private void BuildItemsContent(Dictionary <string, object> itemPropertys, EntityDefinition def, DojoCompile dojoCompile, JsonWriter jsonWriter, string AllForeigns) { var inheritEntityId = (from t in itemPropertys where t.Key == "InheritEntityId" select t.Value).FirstOrDefault(); if (inheritEntityId != null) { var entityItems = dojoCompile.ProjectItems.Where(a => a.Value.DocumentType == GlobalIds.DocumentType.Entity && a.Key == int.Parse(inheritEntityId.ToString())).ToList(); foreach (var item in entityItems) { var defItem = dojoCompile.GetDocumentBody(item.Value) as EntityDefinition; BuildFiledsString(defItem, dojoCompile, jsonWriter, AllForeigns); //递归处理 BuildItemsContent(item.Value.Propertys, def, dojoCompile, jsonWriter, AllForeigns); } } else { BuildFiledsString(def, dojoCompile, jsonWriter, AllForeigns); } }