diff --git a/CoreCms.Net.CodeGenerator/CoreCms.Net.CodeGenerator.csproj b/CoreCms.Net.CodeGenerator/CoreCms.Net.CodeGenerator.csproj index af88d6c6..f52e390b 100644 --- a/CoreCms.Net.CodeGenerator/CoreCms.Net.CodeGenerator.csproj +++ b/CoreCms.Net.CodeGenerator/CoreCms.Net.CodeGenerator.csproj @@ -4,6 +4,22 @@ net7.0 + + + + + + + + + + + + + + + + @@ -15,6 +31,19 @@ + + + + + + + + + + + + + diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Api.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Api.tpl new file mode 100644 index 00000000..b1764971 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Api.tpl @@ -0,0 +1,4 @@ +import { API_PROXY_PREFIX } from "../api"; + +export const GetPageListUrl: string = `${API_PROXY_PREFIX}/{{ModelClassName}}/GetPageList`; + diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/DetailConfig.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/DetailConfig.tpl new file mode 100644 index 00000000..eaafc199 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/DetailConfig.tpl @@ -0,0 +1,19 @@ +import { IData } from "@/components/data-detail-display"; +import { FieldTypeEnum } from "@/components/data-detail-display/enum"; + +const detailConfig: { title: string; dataField: string; fields: Array } = { + title: "详情", + dataField: "", + fields: [ + {% for field in ModelFields %} + {% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %} + { label: "{{field.ColumnDescription}}", key: "{{field.DbColumnName}}",type:FieldTypeEnum.PICTURE }, + {% else %} + { label: "{{field.ColumnDescription}}", key: "{{field.DbColumnName}}" }, + {% endif %} + {% endfor %} + ], +}; + +//IData +export default detailConfig; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/FormSchema.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/FormSchema.tpl new file mode 100644 index 00000000..40468288 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/FormSchema.tpl @@ -0,0 +1,112 @@ +import { ControlTypeEnum, validateTriggerEnum, validateTypeEnum, } from "@/components/coreshop-form/enum"; +import { IFormSchema } from "@/components/coreshop-form/type"; + +const formSchema: IFormSchema = { + saveDataSourceKey: "{{ModelClassName}}/DoCreate", + editDataSourceKey: "{{ModelClassName}}/DoEdit", + queryDataSourceKey: "{{ModelClassName}}/GetEdit", + filter: null, + labelCol: { span: 3 }, + fieldValueModel: "model", + fields: [ + {% for field in ModelFields %} + + {% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %} + { + key: "{{field.DbColumnName}}", + name: "{{field.ColumnDescription}}", + value: "", + placeholder: "请上传{{field.ColumnDescription}}", + type: ControlTypeEnum.FILE, + }, + + {% elsif field.DataType == 'nvarchar' %} + { + key: "{{field.DbColumnName}}", + name: "{{field.ColumnDescription}}", + value: "", + placeholder: "请输入{{field.ColumnDescription}}", + type: ControlTypeEnum.STRING, + config: { + rules: [ + { + required: true, + message: "{{field.ColumnDescription}}不能为空", + trigger: validateTriggerEnum.blur, + type: validateTypeEnum.string, + }, + ], + }, + }, + + {% elsif field.DataType == 'int' or field.DataType == 'bigint' %} + { + key: "{{field.DbColumnName}}", + name: "{{field.ColumnDescription}}", + placeholder: "请输入{{field.ColumnDescription}}", + type: ControlTypeEnum.NUMBER, + value: 1000, + config: { + rules: [ + { + required: true, + message: "{{field.ColumnDescription}}不能为空", + trigger: validateTriggerEnum.blur, + type: validateTypeEnum.number, + }, + ], + }, + }, + + {% elsif field.DataType == 'datetime' %} + { + key: "{{field.DbColumnName}}", + name: "请选择{{field.ColumnDescription}}", + placeholder: "请选择{{field.ColumnDescription}}", + type: ControlTypeEnum.DATE_PICKER, + }, + + {% elsif field.DataType == 'bit' %} + { + key: "{{field.DbColumnName}}", + name: "{{field.ColumnDescription}}", + value: false, + placeholder: "{{field.ColumnDescription}}", + type: ControlTypeEnum.SWITCH, + config: { + rules: [ + { + required: true, + message: "{{field.ColumnDescription}}", + trigger: validateTriggerEnum.blur, + type: validateTypeEnum.boolean + }, + ], + checkedLabel: "是", + unCheckedLabel: "否", + }, + }, + + {% else %} + { + key: "{{field.DbColumnName}}", + name: "{{field.ColumnDescription}}", + value: "", + placeholder: "请输入{{field.ColumnDescription}}", + type: ControlTypeEnum.STRING, + config: { + rules: [ + { + required: true, + message: "{{field.ColumnDescription}}不能为空", + trigger: validateTriggerEnum.blur, + type: validateTypeEnum.string, + }, + ], + }, + }, + {% endif %} + {% endfor %} + ]} + +export default formSchema; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Index.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Index.tpl new file mode 100644 index 00000000..9ff18c5c --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Index.tpl @@ -0,0 +1,205 @@ + + + diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Model.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Model.tpl new file mode 100644 index 00000000..93af4535 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Model.tpl @@ -0,0 +1,49 @@ + + /** {{ModelDescription}} */ + export interface I{{ModelClassName}} + { + {% for field in ModelFields %} + /** {{field.ColumnDescription}} */ + {% if field.DataType == 'nvarchar' or field.DataType == 'varchar' or field.DataType == 'text' %} + {{field.DbColumnName}}:string; + {% elsif field.DataType == 'int' and field.IsNullable == false %} + {{field.DbColumnName}}:number; + {% elsif field.DataType == 'int' and field.IsNullable == true %} + {{field.DbColumnName}}?:number; + {% elsif field.DataType == 'bigint' and field.IsNullable == false %} + {{field.DbColumnName}}:number; + {% elsif field.DataType == 'bigint' and field.IsNullable == true %} + {{field.DbColumnName}}?:number; + {% elsif field.DataType == 'float' and field.IsNullable == false %} + {{field.DbColumnName}}:number; + {% elsif field.DataType == 'float' and field.IsNullable == true %} + {{field.DbColumnName}}?:number; + {% elsif field.DataType == 'bit' and field.IsNullable == false %} + {{field.DbColumnName}}:boolean; + {% elsif field.DataType == 'bit' and field.IsNullable == true %} + {{field.DbColumnName}}?:boolean; + {% elsif field.DataType == 'datetime' and field.IsNullable == false %} + {{field.DbColumnName}}:Date; + {% elsif field.DataType == 'datetime' and field.IsNullable == true %} + {{field.DbColumnName}}?:Date; + {% elsif field.DataType == 'date' and field.IsNullable == false %} + {{field.DbColumnName}}:Date; + {% elsif field.DataType == 'date' and field.IsNullable == true %} + {{field.DbColumnName}}?:Date; + {% elsif field.DataType == 'uniqueidentifier' and field.IsNullable == false %} + {{field.DbColumnName}}:string; + {% elsif field.DataType == 'uniqueidentifier' and field.IsNullable == true %} + {{field.DbColumnName}}?:string; + {% elsif field.DataType == 'decimal' and field.IsNullable == false %} + {{field.DbColumnName}}:number; + {% elsif field.DataType == 'decimal' and field.IsNullable == true %} + {{field.DbColumnName}}?:number; + {% elsif field.DataType == 'numeric' and field.IsNullable == false %} + {{field.DbColumnName}}:number; + {% elsif field.DataType == 'numeric' and field.IsNullable == true %} + {{field.DbColumnName}}?:number; + {% else %} + {% endif %} + {% endfor %} + } + diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouter.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouter.tpl new file mode 100644 index 00000000..9466eff8 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouter.tpl @@ -0,0 +1,13 @@ +export const routers: Array = [ + { + path: "{{ModelClassName}}", + name: "{{ModelDescription}}", + meta: { + page: { + closable: false, + }, + authority: "*", + }, + component: () => import("./{{ModelClassName}}/index.vue"), + } +]; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouterIndex.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouterIndex.tpl new file mode 100644 index 00000000..13d511e5 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/PageRouterIndex.tpl @@ -0,0 +1,5 @@ +import { routers } from './router'; + +export { + routers , +} \ No newline at end of file diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Router.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Router.tpl new file mode 100644 index 00000000..4c4a3346 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Router.tpl @@ -0,0 +1,13 @@ +import { routers as {{ModelClassName}}Router } from "@/pages/{{ModelClassName}}"; +const routes = [ + { + path: "{{ModelClassName}}", + name: "{{ModelDescription}}管理", + meta: { + icon: FileTextOutlined, + authority: "*", + }, + component: CoreshopPageView, + children: [...{{ModelClassName}}Router], + }, +] \ No newline at end of file diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/SearchField.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/SearchField.tpl new file mode 100644 index 00000000..b834950b --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/SearchField.tpl @@ -0,0 +1,32 @@ +import { FieldTypeEnum, ISearchField } from "@/components/searchForm"; +import { markRaw } from "vue"; +const searchFields: Array = markRaw([ + {% for field in ModelFields %} + {% if field.DataType == 'bit' %} + { + field: "{{field.DbColumnName}}", + type: FieldTypeEnum.SELECT, + placeholder: "请选择{{field.ColumnDescription}}", + options: [ + { label: "是", value: true }, + { label: "否", value: false }, + ], + }, + + {% elsif field.DataType == 'datetime' %} + { + field: "{{field.DbColumnName}}", + type: FieldTypeEnum.DATE, + placeholder: ['开始时间', '结束时间'] + }, + {% else %} + { + field: "{{field.DbColumnName}}", + type: FieldTypeEnum.STRING, + placeholder: "请输入{{field.ColumnDescription}}" + }, + {% endif %} + {% endfor %} +]) + +export default searchFields; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Service.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Service.tpl new file mode 100644 index 00000000..7f162c6b --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Service.tpl @@ -0,0 +1,8 @@ +import { HttpMehtod } from "@/enum"; +import { request } from "@/utils/request"; +import { Observable } from "rxjs"; +import { GetPageListUrl } from "./api"; + +export function getPageList(params: any): Observable { + return request(GetPageListUrl, HttpMehtod.FORM_DATA, params) +} diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Store.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Store.tpl new file mode 100644 index 00000000..16c657ce --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/Store.tpl @@ -0,0 +1,52 @@ +import { I{{ModelClassName}} } from "@/models/{{ModelClassName}}"; +import * as {{ModelClassName}}Service from "@/services/{{ModelClassName}}Service"; + +export const Set_{{ModelClassName}}_List :string = "Set_{{ModelClassName}}_List"; + +interface I{{ModelClassName}}Entity { + {{ModelClassName}}?: Array; + count: number; +} + +export interface IState { + {{ModelClassName}}: I{{ModelClassName}}Entity; +} + +const state = (): IState => ({ + {{ModelClassName}}: { + {{ModelClassName}}: [], + count: 0, + }, +}); + +const mutations: { [key: string]: Function } = { + [Set_{{ModelClassName}}_List](state: IState, payload: { [key: string]: any }) { + state.{{ModelClassName}}.{{ModelClassName}} = payload.data; + state.{{ModelClassName}}.count = payload.count; + }, + + /** 删除数据 */ + deleteDataById(state: IState, id: number| string) { + state.{{ModelClassName}}.{{ModelClassName}}=state.{{ModelClassName}}.{{ModelClassName}}?.filter(x=>x.id!==id); +}, + +}; + +const getters: { [key: string]: Function } = {}; + +const actions = { + /** 列表查询 */ + getPageList({ commit }: any, params: { [key: string]: any }) { + {{ModelClassName}}Service.getPageList(params).subscribe((res) => { + commit(Set_{{ModelClassName}}_List, res); + }); + }, +}; + +export default { + namespaced: true, + state, + mutations, + actions, + getters, +}; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/StoreModulesIndex.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/StoreModulesIndex.tpl new file mode 100644 index 00000000..92821408 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/StoreModulesIndex.tpl @@ -0,0 +1,6 @@ + +import {{ModelClassName}} from "./{{ModelClassName}}"; + +export default { + {{ModelClassName}}, +}; diff --git a/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/TableConfig.tpl b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/TableConfig.tpl new file mode 100644 index 00000000..d6770557 --- /dev/null +++ b/CoreCms.Net.CodeGenerator/CrudTemplete/Vue/TableConfig.tpl @@ -0,0 +1,42 @@ +import { ButtonEnum, ITableConfig } from "@/components/table"; + +const tableConfig: ITableConfig = { + buildInButtons: [ + { + buttonKey: ButtonEnum.selectExcelExport, + dataSource: "api/{{ModelClassName}}/SelectExportExcel", + }, + { + buttonKey: ButtonEnum.queryExcelExport, + dataSource: "api/{{ModelClassName}}/QueryExportExcel", + }, + ], + columns: [ + {% for field in ModelFields %} + {% if field.DbColumnName contains 'Image' or field.DbColumnName contains 'image' or field.DbColumnName contains 'thumbnail' or field.DbColumnName contains 'Thumbnail' %} + { + title: "{{field.ColumnDescription}}", + key: "{{field.DbColumnName}}", + dataIndex: "{{field.DbColumnName}}", + slots: { customRender: "{{field.DbColumnName}}" }, + width: "5%", + },{% else %} + { + title: "{{field.ColumnDescription}}", + key: "{{field.DbColumnName}}", + dataIndex: "{{field.DbColumnName}}", + }, + {% endif %} + {% endfor %} + { + title: "操作", + dataIndex: "action", + key: "action", + align: "center", + width: "18%", + slots: { customRender: "action" }, + }, + ], +}; + +export default tableConfig; diff --git a/CoreCms.Net.CodeGenerator/GeneratorCodeHelper.cs b/CoreCms.Net.CodeGenerator/GeneratorCodeHelper.cs index 0c2d9a04..f0fb456f 100644 --- a/CoreCms.Net.CodeGenerator/GeneratorCodeHelper.cs +++ b/CoreCms.Net.CodeGenerator/GeneratorCodeHelper.cs @@ -23,7 +23,7 @@ namespace CoreCms.Net.CodeGenerator /// 表名称 /// 表说明 /// 表字段 - public static byte[] CodeGenerator(string tableName, string tableDescription, List columns, string fileType) + public static byte[] CodeGenerator(string tableName, string tableDescription, List columns, string fileType, bool isVue = false) { //ModelClassName //ModelName @@ -32,7 +32,7 @@ namespace CoreCms.Net.CodeGenerator byte[] data; var obj = new { - ModelCreateTime= dt, + ModelCreateTime = dt, ModelName = tableName, ModelDescription = tableDescription, ModelClassName = tableName, @@ -143,56 +143,17 @@ namespace CoreCms.Net.CodeGenerator } } - //CreateHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8)) + // 生成layUI 前端代码 + if (isVue == false) { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForLayUI(obj, tableName, zip); } - //EditHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8)) + // 生成 vue 前端代码 + else { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForVue(obj, tableName, zip); } - //DetailsHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - - //IndexHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } break; case "EntityFiles": //Model @@ -235,55 +196,14 @@ namespace CoreCms.Net.CodeGenerator } break; case "ViewFiles": - //CreateHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - //EditHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - //DetailsHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8)) + if (isVue == false) { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForLayUI(obj, tableName, zip); } - - //IndexHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8)) + else { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForVue(obj, tableName, zip); } break; case "InterFaceFiles": @@ -325,7 +245,7 @@ namespace CoreCms.Net.CodeGenerator /// 表名称 /// 表说明 /// 表字段 - public static byte[] CodeGeneratorAll(List dbModels, string fileType) + public static byte[] CodeGeneratorAll(List dbModels, string fileType, bool isVue = false) { //ModelClassName //ModelName @@ -446,55 +366,14 @@ namespace CoreCms.Net.CodeGenerator } } - //CreateHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8)) + // 生成 + if (isVue == false) { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/create.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForLayUI(obj, item.Name, zip); } - //EditHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8)) + else { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/edit.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - - //DetailsHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/details.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - - //IndexHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/index.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForVue(obj, item.Name, zip); } break; case "EntityFiles": @@ -538,55 +417,14 @@ namespace CoreCms.Net.CodeGenerator } break; case "ViewFiles": - //CreateHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/create.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - //EditHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8)) - { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/edit.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } - } - //DetailsHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8)) + if (isVue == false) { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/details.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForLayUI(obj, item.Name, zip); } - - //IndexHtml - using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8)) + else { - file = reader.ReadToEnd(); - template = Template.Parse(file); - result = template.Render(Hash.FromAnonymousObject(obj)); - ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + item.Name.ToLower().ToLower() + "/index.html"); - using (StreamWriter entryStream = new StreamWriter(entry1.Open())) - { - entryStream.Write(result); - } + CodeGeneratorForVue(obj, item.Name, zip); } break; case "InterFaceFiles": @@ -625,5 +463,271 @@ namespace CoreCms.Net.CodeGenerator return data; } + public static void CodeGeneratorForLayUI(object obj, string tableName, ZipArchive zip) + { + var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly; + string file; + string result; + Template template; + //CreateHtml + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Create.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/create.html"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + //EditHtml + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Edit.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/edit.html"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + //DetailsHtml + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Details.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/details.html"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + //IndexHtml + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.View.Index.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("Html/" + tableName.ToLower().ToLower() + "/index.html"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + } + + // 生成vue 前端代码 + public static void CodeGeneratorForVue(object obj, string tableName, ZipArchive zip) + { + // 前端页面 + var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly; + string file; + string result; + Template template; + //CreateHtml + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Index.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/index.vue"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 创建页面路由 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.PageRouter.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/router.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 导出页面路由 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.PageRouterIndex.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/index.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 创建路由 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Router.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("router.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 前端接口模型 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Model.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("models/" + tableName + "/index.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 前端服务(Service) + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Service.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("services/" + tableName + "Service/index.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 前端 服务端调用的API 地址 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Api.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("services/" + tableName + "Service/api.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 前端 数据状态 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.Store.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("store/modules/" + tableName + "/index.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 前端 数据状态管理默认导出index + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.StoreModulesIndex.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("store/modules/index.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 创建数据表达配置 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.FormSchema.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/form-schema.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 创建查看详情配置 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.DetailConfig.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/detail-config.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + + // 创建表格搜索字段配置 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.SearchField.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/search-field.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + // 创建表格字段配置 + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Vue.TableConfig.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("pages/" + tableName + "/" + tableName + "/table-config.ts"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + } + + public static void CodeGeneratorForInterFaceFiles(object obj, string tableName, ZipArchive zip) + { + var assembly = IntrospectionExtensions.GetTypeInfo(typeof(GeneratorCodeHelper)).Assembly; + string file; + string result; + Template template; + //IRespository + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Repositories.IRepository.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry3 = zip.CreateEntry("IRepository/I" + tableName + "Repository.cs"); + using (StreamWriter entryStream = new StreamWriter(entry3.Open())) + { + entryStream.Write(result); + } + } + //Respository + using (var reader = new StreamReader(assembly.GetManifestResourceStream("CoreCms.Net.CodeGenerator.CrudTemplete.Repositories.Repository.tpl"), Encoding.UTF8)) + { + file = reader.ReadToEnd(); + template = Template.Parse(file); + result = template.Render(Hash.FromAnonymousObject(obj)); + ZipArchiveEntry entry1 = zip.CreateEntry("Repository/" + tableName + "Repository.cs"); + using (StreamWriter entryStream = new StreamWriter(entry1.Open())) + { + entryStream.Write(result); + } + } + } } } diff --git a/CoreCms.Net.IRepository/CodeGenerator/ICodeGeneratorRepository.cs b/CoreCms.Net.IRepository/CodeGenerator/ICodeGeneratorRepository.cs index 06a96fa0..daa3dc28 100644 --- a/CoreCms.Net.IRepository/CodeGenerator/ICodeGeneratorRepository.cs +++ b/CoreCms.Net.IRepository/CodeGenerator/ICodeGeneratorRepository.cs @@ -33,7 +33,7 @@ namespace CoreCms.Net.IRepository ///// ///// ///// - byte[] CodeGen(string tableName, string fileType); + byte[] CodeGen(string tableName, string fileType, bool isVue = false); /// @@ -42,6 +42,6 @@ namespace CoreCms.Net.IRepository /// /// /// - byte[] CodeGenByAll(string fileType); + byte[] CodeGenByAll(string fileType, bool isVue = false); } } \ No newline at end of file diff --git a/CoreCms.Net.IServices/CodeGenerator/ICodeGeneratorServices.cs b/CoreCms.Net.IServices/CodeGenerator/ICodeGeneratorServices.cs index c60b2bef..21ec9351 100644 --- a/CoreCms.Net.IServices/CodeGenerator/ICodeGeneratorServices.cs +++ b/CoreCms.Net.IServices/CodeGenerator/ICodeGeneratorServices.cs @@ -33,7 +33,7 @@ namespace CoreCms.Net.IServices ///// ///// ///// - byte[] CodeGen(string tableName, string fileType); + byte[] CodeGen(string tableName, string fileType, bool isVue = false); /// @@ -42,6 +42,6 @@ namespace CoreCms.Net.IServices /// /// /// - byte[] CodeGenByAll(string fileType); + byte[] CodeGenByAll(string fileType, bool isVue = false); } } \ No newline at end of file diff --git a/CoreCms.Net.Repository/CodeGenerator/CodeGeneratorRepository.cs b/CoreCms.Net.Repository/CodeGenerator/CodeGeneratorRepository.cs index de440319..9131277e 100644 --- a/CoreCms.Net.Repository/CodeGenerator/CodeGeneratorRepository.cs +++ b/CoreCms.Net.Repository/CodeGenerator/CodeGeneratorRepository.cs @@ -55,7 +55,7 @@ namespace CoreCms.Net.Repository.CodeGenerator /// /// /// - public byte[] CodeGen(string tableName, string fileType) + public byte[] CodeGen(string tableName, string fileType, bool isVue = false) { var tables = DbClient.DbMaintenance.GetTableInfoList(false); var views = DbClient.DbMaintenance.GetViewInfoList(false); @@ -66,7 +66,7 @@ namespace CoreCms.Net.Repository.CodeGenerator } var columns = DbClient.DbMaintenance.GetColumnInfosByTableName(tb.Name, false); - return GeneratorCodeHelper.CodeGenerator(tb.Name, tb.Description, columns, fileType); + return GeneratorCodeHelper.CodeGenerator(tb.Name, tb.Description, columns, fileType, isVue); } @@ -76,7 +76,7 @@ namespace CoreCms.Net.Repository.CodeGenerator /// /// /// - public byte[] CodeGenByAll(string fileType) + public byte[] CodeGenByAll(string fileType, bool isVue = false) { var tables = DbClient.DbMaintenance.GetTableInfoList(false); var views = DbClient.DbMaintenance.GetViewInfoList(false); @@ -96,7 +96,7 @@ namespace CoreCms.Net.Repository.CodeGenerator if (!allDb.Any()) return null; - return GeneratorCodeHelper.CodeGeneratorAll(allDb, fileType); + return GeneratorCodeHelper.CodeGeneratorAll(allDb, fileType, isVue); } } } \ No newline at end of file diff --git a/CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs b/CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs index 16e12035..99dfb29c 100644 --- a/CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs +++ b/CoreCms.Net.Services/CodeGenerator/CodeGeneratorServices.cs @@ -52,9 +52,9 @@ namespace CoreCms.Net.Services.CodeGenerator /// /// /// - public byte[] CodeGen(string tableName, string fileType) + public byte[] CodeGen(string tableName, string fileType, bool isVue = false) { - return _dal.CodeGen(tableName, fileType); + return _dal.CodeGen(tableName, fileType, isVue); } @@ -65,10 +65,9 @@ namespace CoreCms.Net.Services.CodeGenerator /// /// /// - public byte[] CodeGenByAll(string fileType) + public byte[] CodeGenByAll(string fileType, bool isVue = false) { - - return _dal.CodeGenByAll(fileType); + return _dal.CodeGenByAll(fileType, isVue); } } diff --git a/CoreCms.Net.Web.Admin/Controllers/System/CodeGeneratorController.cs b/CoreCms.Net.Web.Admin/Controllers/System/CodeGeneratorController.cs index 479df4f8..21cd6e10 100644 --- a/CoreCms.Net.Web.Admin/Controllers/System/CodeGeneratorController.cs +++ b/CoreCms.Net.Web.Admin/Controllers/System/CodeGeneratorController.cs @@ -128,6 +128,57 @@ namespace CoreCms.Net.Web.Admin.Controllers } + /// + /// 生成代码 + /// + /// + /// + /// + [HttpPost] + [Description("生成代码Vue")] + public IActionResult CodeGenDownVue([FromQuery] string tableName, [FromQuery] string fileType) + { + var jm = new AdminUiCallBack(); + if (string.IsNullOrEmpty(tableName)) + { + jm.msg = "请选择数据库"; + return new JsonResult(jm); + } + if (string.IsNullOrEmpty(fileType)) + { + jm.msg = "请选择要导出的文件类型"; + return new JsonResult(jm); + } + + if (tableName == "AllTable") + { + var data = _codeGeneratorServices.CodeGenByAll(fileType, true); + if (data != null) + { + return File(data, System.Net.Mime.MediaTypeNames.Application.Zip, tableName + "-" + fileType + ".zip"); + } + else + { + jm.msg = tableName + "获取数据库字段失败"; + return new JsonResult(jm); + } + } + else + { + var data = _codeGeneratorServices.CodeGen(tableName, fileType, true); + if (data != null) + { + return File(data, System.Net.Mime.MediaTypeNames.Application.Zip, tableName + "-" + fileType + ".zip"); + } + else + { + jm.msg = tableName + "获取数据库字段失败"; + return new JsonResult(jm); + } + } + + } + #region 获取所有表和表名并生成excel diff --git a/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.xml b/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.xml index c50e80b4..af2b2539 100644 --- a/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.xml +++ b/CoreCms.Net.Web.Admin/CoreCms.Net.Web.Admin.xml @@ -4299,6 +4299,14 @@ + + + 生成代码 + + + + + 获取所有表和表名并生成excel diff --git a/CoreCms.Net.Web.Admin/appsettings.json b/CoreCms.Net.Web.Admin/appsettings.json index a888fbb5..3285a33e 100644 --- a/CoreCms.Net.Web.Admin/appsettings.json +++ b/CoreCms.Net.Web.Admin/appsettings.json @@ -262,4 +262,4 @@ "WxOpenToken": "", "WxOpenEncodingAESKey": "" } -} \ No newline at end of file +}